Rails从自定义窗体调用自定义控制器操作

时间:2014-11-17 17:35:40

标签: ruby-on-rails forms

在Rails项目中,我对控制器exchanges.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 / interchange / 2(这是表单所在的页面)
  2. 订单ID作为文本字段
  3. 的输入
  4. 操作应更新的两个可能的交换字段中的哪一个
  5. 接下来我需要创建一个自定义表单,它将这些值作为参数传递给操作。我还没有找到关于如何做到这一点的好教程,但我的第一个想法是设置以下内容:

    <%= 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'是未定义的。我猜我需要修改第一行代码以将表单与我设置的自定义操作相关联,但不知道如何正确执行此操作。

1 个答案:

答案 0 :(得分:4)

是的,我明白你的意思了。所以你想要以下内容:

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

因此,让我回答以下解决方案,并发现您在代码中犯的一些错误。

# 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方法。对于成员操作,表单助手默认使用patch作为http方法。你只需要设置网址。

希望你了解我的流程。