2014-01-31 33 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錯誤。