2014-01-31 31 views
0

我有多对多的关系,我想用复选框来选择我需要的关系。 控制器(我用的支架)rails 4多对多表格保存和更新

... 
    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 

型号

class Property < ActiveRecord::Base 
    has_and_belongs_to_many :characteristics 
    mount_uploader :image, PropertyUploader 
end 

class Characteristic < ActiveRecord::Base 
    has_and_belongs_to_many :properties 
end 

我为特征

<%= 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 

我跟着screencast但导轨4预计HABTM为{:child_id => []}和形式应具有parentmodel [child_ids] []但不parentmodel [:child_ids] []或它会导致“未经许可的参数:: child_ids”

回答

0

如果params[:characteristic]不存在,它将返回nil。如果它返回nil,那么你打电话nil[:property_ids],这将会引发错误,因为nil不支持括号表示法。

对此的一种简单的方法是用三元运算符:

ids = params[:characteristic] ? params[:characteristic][:property_ids] : [] 

然后,你可以mergeidsparams如果这是你想要做什么。您可能需要调整数据类型以匹配(数组与散列),具体取决于它们是如何进入的,但这会让您通过undefined method错误。