Ruby on rails 将自定义窗体值传递给自定义控制器操作

Ruby on rails 将自定义窗体值传递给自定义控制器操作,ruby-on-rails,forms,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

在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
由于这些参数不是exchange表中的实际数据字段,因此我通常会使用以下链接来调用该操作:

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 %>


"1" %> "2" %>
当我试图呈现此表单时,收到错误:未定义的方法'ordid'for#

在研究这个问题时,我发现我可以通过将text_字段行更改为:

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

在解决初始错误的同时,它会抛出一个新错误:未定义的方法'text\u field\u tag'for#


关于我做错了什么有什么想法吗?

我自己对这一点有点陌生,但我相信这是因为您从表单中调用了“text\u field\u tag”,而不是表单标记生成器对象。请尝试将对象的窗体保留为:

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

我自己对此有点陌生,但我相信这是因为您从表单中调用了“text\u field\u tag”,而不是表单标记生成器对象。请尝试将对象的窗体保留为:

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

由于表单元素不表示模型的属性,因此不能对使用
form\u。使用
表单标签

<%= 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%>
:补丁)do%>

文件


由于表单元素不表示模型的属性,因此不能对
使用
form\u。使用
表单标签

<%= 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%>
:补丁)do%>

文件



\u标签
后缀不用于
表单
。好的,我还应该做些什么来允许表单传递参数吗?你能公布你的全部错误吗。
\u标签
后缀不用于
表单
。好的,我还应该做些什么来允许表单传递参数吗?你能发布你的整个错误吗?谢谢,我尝试了这段代码,但得到了错误:没有路由匹配[post]“/exchanges/2/update\u ordid”我还需要修改控制器中的任何内容吗?我的路由是:resources:exchanges Do patch:update\u ordid,on::member End默认情况下,表单提交将是一个post请求。由于您已经定义了修补程序的路径,因此必须以形式_tagThank显式指定该方法!这使我与第一个答案的观点相同。这一行肯定仍然有问题:“1”%>因为“1”的值没有传递给控制器。根据hidden_field_标记的文档,value是第二个参数。不是hashThank,我尝试了这段代码,但是得到了一个错误:没有路由匹配[POST]“/exchanges/2/update\u ordid”我也需要修改控制器中的任何内容吗?我的路由是:resources:exchanges Do patch:update\u ordid,on::member end默认情况下,表单提交将是一个POST请求。由于您已经定义了修补程序的路径,因此必须以形式_tagThank显式指定该方法!这使我与第一个答案的观点相同。这一行肯定仍然有问题:“1”%>因为“1”的值没有传递给控制器。根据hidden_field_标记的文档,value是第二个参数。在这种方法中,虽然您已经解决了它,但它不是hashi猜想的,因为
:ordid
是表中的一列,最好在表单中使用
,这使它非常接近正常工作,尽管隐藏字段肯定仍然存在问题,因为:ordfld没有将其值传递给控制器。“1”%>(Rahul,:ordid实际上不是表中的一列。)哦,如果它不是数据库中的一列,那么这将很好。您可以为
绑定
form\u,只使用数据库中存在的列。我想在这种方法中,虽然您已经解决了它,但它不是正确的方法,因为
:ordid
是表中的一列,最好在您的表单中使用
,这使它非常接近正常工作,尽管隐藏字段仍然存在问题,因为:ordfld没有将其值传递给控制器。“1”%>(Rahul,:ordid实际上不是表中的一列。)哦,如果它不是数据库中的一列,那么这将很好。只能使用数据库中存在的列为
绑定表单。