簡體   English   中英

Rails創建has_and_belongs_to_many復選框

[英]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_manybelongs_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM