button_to in Rails 4:重定向到带有参数和 Bootstrap Class 的控制器操作

button_to in Rails 4 : Redirection to Controller action with params and Bootstrap Class

在我的 Rails 4 项目中,在客户视图中我想定义一个 button_to ,调用 my_method 在我的客户控制器中。我也想通过 bootstarp 传递一些参数 class: class: "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"

如何实现?

<%= button_to "Charge Customer", charge_lease_customer_customers_path, method: :get, params: { doc_delete: true }, class: "btn btn-primary" %>

根据 docs:

If no :method modifier is given, it will default to performing a POST operation

--

由于您的路由是 GET 请求,Rails 无法识别您尝试写入的内容。您的 button_to 助手正在使用 POST 动词填充路由。您需要显式定义 method: :get 以使路由有效


您还应该查看您的 routes,特别是,只要可能,您应该围绕 resources:

确定路线范围
#config/routes.rb
resources :customers do 
   get :charge_lease_customer, on: :collection
end

更新

你不应该通过你的路线传递 pre-defined 数据 除非 数据是公开可变的。 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 参数,它可以被你的控制器获取:

#app/controllers/customers_controller.rb
class CustomersController < ApplicationController
   def charge_lease_customer
      @customer = Customer.find params[:id] 
      # do something with @customer
   end 
end

--

如果您想通过参数传递 customer-specific 数据,您必须确保它全部在 "top level" 参数结构中:

<%= button_to "x", button_path, params: { customer_id: @customer.id, customer_name: @customer_name } %>

不推荐-太多了configuration