通过Rails中的按钮调用控制器方法

时间:2017-03-08 20:18:42

标签: mysql sql ruby-on-rails

我想在views / companies / edit.html.haml中为destroy_referrals方法创建一个按钮,但我无法使该按钮起作用。要在按钮上调用操作,我尝试创建一个新路由,但我仍然收到错误找不到公司控制器的操作'destroy_referrals'

我在destroy_referrals

中创建了Admin::CompaniesController方法
def destroy_referrals
    load_company
    @company.destroy_referrals
    flash[:notice] = 'Referrals deleted'
    redirect_to :action => :index
end 

它操纵company.rb模型以查找具有相同company_id的用户的推介并销毁它们,

def destroy_referrals
    Referral.joins(:user).where("users.company_id = ?", self.id).destroy_all
end

我在下面尝试过的一些事情......

的routes.rb

post '/destroy_referrals' => 'admin/companies#destroy_referrals', :as => 'destroy_referrals'

视图/公司/ edit.html.haml

= button_to 'Destroy Referrals', destroy_referral_path

= button_to 'Destroy Referrals', admin_company_destroy_referral_path(@company)

2 个答案:

答案 0 :(得分:3)

  1. HTML链接(不是“按钮”)未连线直接调用“方法”。
  2. button_to方法创建一个HTML按钮,其行为与链接类似,但具有不同的视觉样式。
  3. Ruby有方法,这是一种常见的编程结构。
  4. HTML链接具有href属性,浏览器可以通过发出后续HTTP请求来跟踪该属性。
  5. 当浏览器向您的Rails应用程序发送请求时,应用程序会使用您的路由来确定如何处理请求
  6. 在Rails中处理请求的传统方法是将其路由到控制器操作。
  7. 根据惯例,对/products/1的RESTful请求可能会路由show上的ProductsController操作。
  8. 在Rails中,通过在控制器上定义方法来创建“操作”。
  9. RESTful路线反映了 re 演示 s tate t 传输范例,包括阅读,列出,创建,更新和删除记录/对象
  10. 要删除(或销毁)记录,RESTful约定将向Rails应用程序发送DELETE请求,该应用程序将路由到由{{定义的相关控制器的destroy操作。 1}}方法。
  11. 您可以创建一个HTML链接,导致浏览器使用destroy帮助程序发送此类请求,并在参数中指定link_to
  12. 您可以使用内置的“资源丰富”路由来定义指示Rails处理此类请求的路由:例如method: :delete。或者,可以定义显式路由:resources :products
  13. 总而言之,Rails给出的错误是它无法在delete '/products/:id' => 'products#destroy'中找到destroy_referrals方法。在CompaniesController中定义方法无法解决此问题。

答案 1 :(得分:0)

  

@Swards需要删除的路线   'companies /:id / destroy_referrals'=> '公司#destroy_referrals',   :as => 'destroy_referrals'

我认为这可能是一个简单的修复。你还需要admin命名空间吗?

考虑这一点,而不是创建命名路线

namespace 'admin' do
  resources :companies do
    delete 'destroy_referrals', :on => :member, :as => 'destroy_referrals'
  end
end

并将其称为admin_destroy_referrals_company_path

= button_to 'Destroy Referrals', admin_destroy_referrals_company_path(@company), :method => :delete