Ruby on rails rails 4多对多表单保存和更新

Ruby on rails rails 4多对多表单保存和更新,ruby-on-rails,forms,many-to-many,Ruby On Rails,Forms,Many To Many,我有多对多关系,我想使用复选框来选择我需要的关系。 我使用脚手架 ... def update #params[:characteristic][:property_ids] ||= [] respond_to do |format| if @characteristic.update(characteristic_params) format.html { redirect_to @characteristic, notice: 'Charact

我有多对多关系,我想使用复选框来选择我需要的关系。 我使用脚手架

...
  def update
    #params[:characteristic][:property_ids] ||= []
    respond_to do |format|
      if @characteristic.update(characteristic_params)
        format.html { redirect_to @characteristic, notice: 'Characteristic was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @characteristic.errors, status: :unprocessable_entity }
      end
    end
  end
...
    def characteristic_params
      params[:characteristic][:property_ids] ||= []
      params.require(:characteristic).permit(:characteristicable_id, :characteristicable_type, :property_ids)

    end
模型

解决

我遵循了这一点,但Rails 4希望HABTM为{:child\u id=>[]},表单应该有parentmodel[child\u id][],而不是parentmodel[:child\u id][],否则它将导致不允许的参数::child\u id

如果params[:characteristic]不存在,它将返回nil。如果它返回nil,则调用nil[:property_id],这将抛出一个错误,因为nil不支持括号表示法

解决这一问题的简单方法是使用三元运算符:

ids = params[:characteristic] ? params[:characteristic][:property_ids] : []
然后,如果您想这样做,可以将ID合并到参数中。您可能必须调整数据类型以匹配数组与散列,这取决于它们的输入方式,但这将使您克服未定义的方法错误

<%= form_for(@characteristic) do |f| %>
  <% if @characteristic.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@characteristic.errors.count, "error") %> prohibited this characteristic from being saved:</h2>

      <ul>
      <% @characteristic.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>

  <% end %>

    <% for  p in Property.find(:all) %>
        <p>
        <%= check_box_tag "characteristic[:property_ids][]", p.id, @characteristic.properties.include?(p)  %>
        <%= image_tag p.image_url(:thumb).to_s %>
        <%= p.name %>
        </p>
    <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
undefined method `[]' for nil:NilClass
params[:characteristic][:property_ids] ||= []
<%= check_box_tag "characteristic[:property_ids][]", p.id, @characteristic.properties.include?(p)  %>
<%= hidden_field_tag "characteristic[property_ids][]", '' %>
...
<%= check_box_tag "characteristic[property_ids][]", p.id, @characteristic.properties.include?(p)  %>
def characteristic_params
          params[:characteristic][:property_ids] ||= []
          params.require(:characteristic).permit(:characteristicable_id, :characteristicable_type, :property_ids)

        end
def characteristic_params
  params.require(:characteristic).permit(:characteristicable_id, :characteristicable_type, { :property_ids => [] })
end
ids = params[:characteristic] ? params[:characteristic][:property_ids] : []