在我的Rails 4项目中,在客户视图中,我想定义 button_to ,以便在我的客户控制器中调用 my_method 。另外我想通过bootstarp类传递一些参数:类:" btn btn-primary" 。
我试过了:
<td><%= button_to "Charge Customer",charge_lease_customer_customers_path, params: { doc_delete: true }, class: "btn btn-primary" %></td>
在我的routes.rb
中get 'charge_lease_customer' => 'customers#charge_lease_customer', as: :charge_lease_customer
当我点击按钮时,会出现以下错误屏幕:
No route matches [POST] "/customers/charge_lease_customer"
如何实现它?
答案 0 :(得分:1)
<%= button_to "Charge Customer", charge_lease_customer_customers_path, method: :get, params: { doc_delete: true }, class: "btn btn-primary" %>
根据docs:
如果未给出
:method
修饰符,则默认执行POST
操作
-
由于您的路由是GET
请求,因此Rails无法识别您要写的内容。您的button_to
助手使用POST
动词填充路线。您需要明确定义method: :get
才能使路由有效
您还应该查看自己的routes
,特别是在可能的情况下,您应该围绕resources
确定路线范围:
#config/routes.rb
resources :customers do
get :charge_lease_customer, on: :collection
end
<强>更新强>
除非数据是公开可更改的,否则您不应通过路径传递预定义数据。 IE也许你想设置doc_delete
或其他什么。
如果您想要修改特定的customer
,则需要member route:
#config/routes.rb
resources :companies do
get :charge_lease_customer, on: :member #-> url.com/customers/:id/charge_lease_customer
end
这个值是因为它允许你传递:id
param,你的控制器可以选择它:
#app/controllers/customers_controller.rb
class CustomersController < ApplicationController
def charge_lease_customer
@customer = Customer.find params[:id]
# do something with @customer
end
end
-
如果您想通过params传递客户特定数据,您必须确保它们都处于“顶级”参数结构中:
<%= button_to "x", button_path, params: { customer_id: @customer.id, customer_name: @customer_name } %>
不推荐这样做 - 太多configuration。