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] : []