Arw*_*452 1 forms ruby-on-rails
在 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
Run Code Online (Sandbox Code Playgroud)
我已经设置了一个到这个控制器操作的路由:
resources :exchanges do
collection do
get 'update_ordid'
end
end
Run Code Online (Sandbox Code Playgroud)
我想调用此操作,该操作接受来自交易所 show.html.erb 页面上的表单的订单 ID。我需要传递三个值:
接下来我需要创建一个自定义表单,它将这些值作为参数传递给操作。我还没有找到关于如何做到这一点的好教程,但我的第一个想法是设置以下内容:
<%= 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 %>
Run Code Online (Sandbox Code Playgroud)
这给了我一个 NoMethodError 说明方法 'ordid' 未定义。我猜我需要修改第一行代码以将表单与我设置的自定义操作相关联,但不知道如何正确执行此操作。
嗯,我明白你的意思了。所以你想要以下东西:
因此,让我回答以下解决方案并找出您在代码中犯的一些错误。
# 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
Run Code Online (Sandbox Code Playgroud)
现在,如果您通过运行生成路线:
bundle exec rake routes
Run Code Online (Sandbox Code Playgroud)
你会看到这样的路径:
update_ordid_exchange /exchange/:id/update_ordid # :id parameter for exchange record
Run Code Online (Sandbox Code Playgroud)
在您的表单中设置网址:
<%= form_for(@exchange, url: update_ordid_exchange_path) do |f| %>
Run Code Online (Sandbox Code Playgroud)
或者
<%= form_for(@exchange, url: url_for(controller: :exchange, action: update_ordid)) do |f| %>
Run Code Online (Sandbox Code Playgroud)
现在,您将可以在此表单的期望字段中的参数中提交这些值。
所以让我在这里总结一下: 1. 正确设置您的路由 2. 通过生成 rake routes 命令检查基于您的路由的 url,如上所示 3. 设置正确的 url 并检查 http 方法是否在表单助手中正确定义。对于成员操作,表单助手默认使用 patch 作为 http 方法。你只需要设置网址。
希望你理解我的流程。
| 归档时间: |
|
| 查看次数: |
2215 次 |
| 最近记录: |