Rails 4中的button_to:使用params和Bootstrap类重定向到Controller操作

时间:2016-01-23 09:21:19

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

在我的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"

如何实现它?

1 个答案:

答案 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