【问题标题】:Rails Call Custom Controller Action from Custom FormRails 从自定义表单调用自定义控制器操作
【发布时间】:2014-11-17 17:35:39
【问题描述】:

在 Rails 项目中,我对控制器 exchange.rb 有以下控制器操作:

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

我已经设置了一个到这个控制器动作的路由:

resources :exchanges do
    collection do
      get 'update_ordid'
    end
end

我想调用这个从交易所 show.html.erb 页面上的表单接受订单 ID 的操作。我需要传递三个值:

  1. 当前交易所的ID,例如本例中的整数 URL localhost:3000/exchanges/2(这是表单所在的页面)
  2. 作为文本字段输入的订单 ID
  3. 操作应更新两个可能的交换字段中的哪一个

接下来我需要创建一个自定义表单,它将这些值作为参数传递给操作。我还没有找到关于如何做到这一点的好教程,但我的第一个想法是设置以下内容:

<%= form_for(@exchange) 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 %>

这给了我一个 NoMethodError 说明方法 'ordid' 未定义。我猜我需要修改第一行代码以将表单与我设置的自定义操作相关联,但不知道如何正确执行。

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    是的,我明白你的意思。所以你想要以下东西:

    • 您编写了自定义操作
    • 您想提交一个表单以执行该操作
    • 您已在路由器中注册您的操作。

    那么让我来回答以下解决方案,并找出您在代码中犯的一些错误。

    # in route.rb
    resources :exchanges do
      patch :update_ordid, on: :member # this is the best practice I would say, 
             #when you are trying to modify an existing record. So this action will only
             #be reached with patch http methods
             # on :member action an parameter id is required.
    end
    

    现在,如果您通过运行生成路线:

    bundle exec rake routes
    

    你会看到这样的路径:

    update_ordid_exchange  /exchange/:id/update_ordid # :id parameter for exchange record
    

    在您的表单中设置网址:

    <%= form_for(@exchange, url: update_ordid_exchange_path) do |f| %>
    

    或

    <%= form_for(@exchange, url: url_for(controller: :exchange, action: update_ordid)) do |f| %>
    

    现在您将可以通过此表单在您的愿望字段中的参数内提交此值。

    所以让我在这里总结一下: 1.正确设置您的路线 2. 如上图所示,通过生成 rake routes 命令检查基于您的路由的 url 3. 设置正确的 url 并检查是否在表单助手中正确定义了 http 方法。对于成员操作,表单助手默认使用补丁作为 http 方法。你只需要设置网址。

    希望你能理解我的流程。

    【讨论】:

    • 非常感谢!我已经实现了这段代码,但仍然在 '' 行得到 NoMethodError 我猜这是因为 :ordid 不是实际的字段交换表,但是我想传递一个自定义参数,就好像我从 'link_to "Update Order ID", update_ordid_exchange(ordfld: 1, ordid: value from form), :method = 之类的 url 调用操作> :post'
    • 您当然可以这样做。只需使用 text_field_tag :ordid 这样您就可以将其作为参数 param[:ordid] 获取,或者如果您希望可以直接在表单中传递您的 url。 :)
    • 谢谢,我试过 但得到的是“未定义的方法 text_field_tag”。
    • 那么这个答案有帮助吗?
    • 最终通过删除 f 来修复它。从有问题的行。感谢您为我指明正确的方向!
    猜你喜欢
    • 2012-07-31
    • 1970-01-01
    • 2011-07-23
    • 2012-06-19
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多