在Rails中,我有一个自定义控制器操作,需要接受表单中的一些参数:
def update_ordid
# Get the active exchange
@exchange = Exchange.find(params[:id])
# Decide which order ID field to update
active_order_field = params[:ordfld]
# Save the order ID
order_id = params[:ordid]
if active_order_field == 1 then
@exchange.order_id_1 = order_id
else
@exchange.order_id_2 = order_id
end
@active_exchange.save
respond_with(@exchange)
end
因为这些参数不是交换表中的实际数据字段,所以我通常会使用以下链接调用该操作:
link_to "Update Order ID", update_ordid_exchange(ordfld: value_from_form, ordid: value_from_form), :method => :post
因为在这种情况下需要通过用户输入来填充这些参数的值,所以我创建了以下表单来传递数据:
<%= form_for(@exchange, url: update_ordid_exchange_path) do |f| %>
<div class="field">
<%= f.label :ordid, "Order ID" %><br>
<%= f.text_field :ordid, class: "form-control" %>
</div>
<% if @isrequestor == true %>
<%f.hidden_field :ordfld, :value => "1" %>
<% else %>
<%f.hidden_field :ordfld, :value => "2" %>
<% end %>
<div class="actions">
<%= f.submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>
当我尝试渲染此表单时,收到错误:未定义的方法`ordid'代表#
在研究这个问题时,我发现我可以通过将text_field行更改为:
来实现此目的。<%= f.text_field_tag :ordid, class: "form-control" %>
虽然这解决了初始错误,但它会抛出一个新错误:未定义的方法`text_field_tag'用于#
关于我做错了什么的想法?
答案 0 :(得分:2)
您不能使用form_for
,因为您的表单元素不代表模型的属性。使用form_tag
代替
<%= form_tag(update_ordid_exchange_path, :method => :patch) do%>
<div class="field">
<%= label_tag "Order ID" %><br>
<%= text_field_tag :ordid, class: "form-control" %>
</div>
<% if @isrequestor == true %>
<%= hidden_field_tag :ordfld, "1" %>
<% else %>
<%= hidden_field_tag :ordfld, "2" %>
<% end %>
<div class="actions">
<%= submit_tag "Submit", class: "btn btn-primary" %>
</div>
<%end%>
文档here
答案 1 :(得分:1)
我自己有点新手,但我相信这是因为你从form_for而不是form_tag构建器对象调用“text_field_tag”。尝试从表格中删除对象:
<%= text_field_tag :ordid, class: "form-control" %>