将自定义表单值传递给自定义控制器操作

时间:2014-11-17 20:54:55

标签: ruby-on-rails forms

在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'用于#

关于我做错了什么的想法?

2 个答案:

答案 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

form_tag vs form_for

hidden_field_tag

答案 1 :(得分:1)

我自己有点新手,但我相信这是因为你从form_for而不是form_tag构建器对象调用“text_field_tag”。尝试从表格中删除对象:

<%= text_field_tag :ordid, class: "form-control" %>