Rails中向Simple Form的f.association传递参数异常问题
问题:Simple Form关联字段无法自动填充URL传递的Office ID
我有多个隶属于Office的Equipment模型,在Office列表页面设置了链接,将Office的ID传递到新增Equipment的表单中:
<%= link_to "", new_equipment_path(office: params[:id]) %>
生成的URL正常,能正确传递点击的Office ID,例如:/equipments/new?office=6
用普通输入框测试时,能正常显示传递的ID:
<%= f.input :observations, input_html: { value: params[:office]} %>
但使用f.association关联字段时,字段为空,虽可手动选择ID,但无法自动填充URL传递的参数,尝试隐藏字段等方式均无效:
<%= f.association :office, label_method: :id, value_method: :id, input_html: { value: params[:office] } %>
相关代码
offices/show.html.erb
<% @offices.each do |office| %> <tr> <td><%= office.name %></td> <td><%= link_to "Add new equipment", new_equipment_path(office: params[:id])%></td> </tr> <% end %>
新增Equipment的form.html.erb
<%= simple_form_for(@equipment) do |f| %> <%= f.association :office, label_method: :id, value_method: :id, input_html: { value: params[:office] } %> <%= f.input :observations, input_html: { value: params[:office]}%> <% end %>
解决方法
Simple Form的f.association字段是基于@equipment对象的属性渲染的,不会直接读取input_html里的value预设选中值。正确做法是在控制器的new动作里,提前把URL传递的office_id赋值给初始化的Equipment对象:
# equipments_controller.rb def new @equipment = Equipment.new(office_id: params[:office]) end
之后视图里的关联字段无需额外设置input_html参数,直接写:
<%= f.association :office, label_method: :id, value_method: :id %>
这样页面加载时,关联字段会自动选中对应的Office,同时保留手动选择的功能。
另外注意Office列表页的链接问题:你当前代码里用的params[:id]会导致所有链接都携带当前页面的同一个ID,应该改成循环中的office.id,确保每个Office对应正确的链接:
<%= link_to "Add new equipment", new_equipment_path(office: office.id) %>
内容的提问来源于stack exchange,提问作者Poluxland
相关产品推荐
相关产品推荐

