[英]Rails creating has_and_belongs_to_many checkbox
我正在嘗試以has_and_belongs_to_many
關系保存復選框選擇。 我想將每條street
鏈接到找到它的maps
。 從map
表顯示在新的或編輯觀點復選框列表。 但是我在將所有這些鏈接在一起時缺少了一些東西。 似乎應該將地圖列表與每個街道項目一起保存,但是我不知道該怎么做。 我為此有一個map
字段references
。
未經驗證的模型:
class Street < ApplicationRecord
has_and_belongs_to_many :maps
end
class Map < ApplicationRecord
has_and_belongs_to_many :streets
end
street_controller.rb(相關部分):
class StreetsController < ApplicationController
before_action :set_street, only: [:show, :edit, :update, :destroy]
def new
@street = Street.new
gon.streetExtentArray = @street.extent_array
@maps = Map.all.order(:year)
end
def edit
@maps = Map.all.order(:year)
gon.streetExtentArray = @street.extent_array
gon.streetExtentJson = @street.extent_json
end
def create
@street = Street.new(street_params)
respond_to do |format|
if @street.save
format.html { redirect_to @street, notice: "Street was successfully created. #{undo_link}" }
format.json { render :show, status: :created, location: @street }
else
format.html { render :new }
format.json { render json: @street.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @street.update(street_params)
format.html { redirect_to @street, notice: "Street was successfully updated. #{undo_link}" }
format.json { render :show, status: :ok, location: @street }
else
format.html { render :edit }
format.json { render json: @street.errors, status: :unprocessable_entity }
end
end
end
private
def street_params
params.require(:street).permit(:city, :previous_name, :current_name, :date_earliest, :date_latest, :cross_streets, :extent_json, :extent, :extent_length, :extent_array, :number_of_blocks, :references, :ref1, :ref2, :ref3, :notes, {:reference_ids => []})
end
end
新視圖和編輯視圖模板的相關部分:
<%= form_with(model: @street, local: true) do |form| %>
<%= form.label "City" %>
<%= form.text_field :city, id: :street_city %>
</div>
< and many other fields >
<%= form.collection_check_boxes( :references, @maps, :id, :name, bootstrap: {check_inline: true}, class: "") do |b|
b.label(:"data-value" => b.value) { b.check_box + b.text }
end %>
<%= form.submit%>
生成的HTML:
<input type="hidden" name="street[map_ids][]" value="" />
<input type="checkbox" value="12" name="street[map_ids][]" id="street_map_ids_12" /><label for="street_map_ids_12">1857 Bancroft</label>
<input type="checkbox" value="7" name="street[map_ids][]" id="street_map_ids_7" /><label for="street_map_ids_7">1888 Sanborn</label>
and six more similar checkboxes
聯接表的遷移:
class CreateJoinTableMapsStreets < ActiveRecord::Migration[5.1]
def change
create_join_table :maps, :streets do |t|
t.index [:map_id, :street_id]
t.index [:street_id, :map_id]
end
end
end
沒有錯誤,但沒有任何保存。 而且我不太了解應將其保存在何處以及如何保存。 我在Streets
表中創建了一個名為references
的字段,但是沒有對此的引用。 而且似乎不應該將其保存在maps_streets
表中,而事實並非如此。
我考慮過擁有更健壯的has_many
和belongs_to
關系,但是我認為我不需要它,也看不出它會如何幫助。
PARAMS? "street"=>{"city"=>"Los Angeles", "previous_name"=>"3rd St", "current_name"=>"Miramar St. One block abandoned", "date_earliest"=>"1921", "date_latest"=>"", "cross_streets"=>"Miramar. And gone one block between Lucas and Bixel", "number_of_blocks"=>"2", "extent_length"=>"", "references"=>["", "7"], "ref1"=>"Baist 1921", "ref2"=>"", "ref3"=>"", "notes"=>"3rd was jogged south starting at Beaudry to what was Crown Hill at Huntley/Boylston", "extent_json"=>"{\\"type\\":\\"LineString\\",\\"coordinates\\":[[-118.26117539280003,34.05901974362122],[-118.2593849946753,34.05823410691563],[-118.25815599257271,34.05768101430694],[-118.25759459655055,34.05717191451128],[-118.25663111959356,34.05654339202722]]}", "extent_array"=>"[[34.05900599436149,-118.26117038726808],[34.057672720136964,-118.25815558433534],[34.057174959049995,-118.25757622718811],[34.0565527535807,-118.25666427612306]]"}, "commit"=>"Update Street", "controller"=>"streets", "action"=>"update", "id"=>"645"}
我認為您只需要進行一些更改。
在您的Controller中,將map_ids添加到允許的參數中。
private
def street_params
params.require(:street).permit(:city, :previous_name, :current_name,
:date_earliest, :date_latest, :cross_streets, :extent_json, :extent,
:extent_length, :extent_array, :number_of_blocks, :notes, :map_ids => [])
end
在您的表單中,collection_check_boxes應該用於:map_ids
<%= form_with(model: @street, local: true) do |form| %>
<%= form.collection_check_boxes( :map_ids, @maps, :id, :name, bootstrap: {check_inline: true}, class: "") do |b|
b.label(:"data-value" => b.value) { b.check_box + b.text }
<% end %>
<% end %>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.