【问题标题】:Call a controller method via button in Rails通过 Rails 中的按钮调用控制器方法
【发布时间】:2017-03-08 20:18:42
【问题描述】:

我想在views/companies/edit.html.haml 中为destroy_referrals 方法创建一个按钮,但我无法让该按钮工作。为了在按钮上调用操作,我尝试创建新路由,但我仍然收到错误无法为 CompaniesController 找到操作“destroy_referrals”

我在Admin::CompaniesController 中创建了一个destroy_referrals 方法,

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'

views/companies/edit.html.haml

= button_to 'Destroy Referrals', destroy_referral_path

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

【问题讨论】:

  • 花点时间阅读您的问题。问问自己你使用的词是什么意思,以及是否可能有一些不那么模棱两可的词会更清楚。例如。 “为了调用按钮上的操作,我尝试创建一条新路线”。您不会“调用”“动作”,“按钮”是一个 UI 概念,也是一个 HTML 标记(两者都没有明确定义的“动作”)。您是否创建了一条新路线,或者您只是尝试过?您如何预计这会改变一切?
  • 我可以通过控制台运行该方法并按预期执行。我现在正在尝试将功能扩展到 UI 并拥有一个按钮。
  • 该错误似乎表明它不会进入 admin/companies 控制器。您可以发布其余的路线文件吗?请求是否被其他路由拦截?
  • @Swards 路由需要是delete 'companies/:id/destroy_referrals' => 'companies#destroy_referrals', :as => 'destroy_referrals'

标签: mysql sql ruby-on-rails


【解决方案1】:
  1. HTML 链接(不是“按钮”)不会直接调用“方法”。
  2. button_to 方法创建一个 HTML 按钮,其行为类似于链接,但具有不同的视觉样式。
  3. Ruby 有方法,这是一种常见的编程结构。
  4. HTML 链接具有href 属性,浏览器可以通过向其发出后续 HTTP 请求来跟踪该属性。
  5. 当浏览器向您的 Rails 应用程序发送请求时,应用程序会使用您的路由来确定如何处理该请求。
  6. 在 Rails 中处理 请求 的常规方法是将其路由到控制器操作。
  7. 按照惯例,对 /products/1 的 RESTful 请求可能会路由到 ProductsController 上的 show 操作。
  8. 在 Rails 中,通过在控制器上定义方法来创建“动作”。
  9. RESTful 路由反映了re表示性s状态t传输范式,涉及读取、列出、创建、更新和删除记录/对象.
  10. 要删除(或销毁)记录,RESTful 约定是向 Rails 应用程序发送 DELETE 请求,该请求将被路由到相关控制器的 destroy 操作,由 destroy 方法定义。
  11. 您可以使用link_to 帮助程序并在参数中指定method: :delete 创建一个HTML 链接,该链接会导致浏览器发送此类请求。
  12. 您可以定义一个路由,指示 Rails 使用内置的“资源丰富”路由来处理此类请求:例如resources :products。或者,可以定义显式路由:delete '/products/:id' => 'products#destroy'。

这就是说,Rails 给你的错误是它在CompaniesController 中找不到destroy_referrals 方法。在Admin::CompaniesController 中定义方法不会解决这个问题。

【讨论】:

  • 感谢 Corey,这不是我所希望的灵丹妙药,而是让我退后一步重新考虑的事情。
【解决方案2】:

@Swards 需要删除的路由 'companies/:id/destroy_referrals' => 'companies#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

【讨论】:

  • admin_destroy_referrals_company_path 是一个 url_helper 并且只返回一个 URI;为了发送DELETE 请求(或使用_method=delete 参数模拟的POST 请求),您需要指定method: :delete 选项并在页面上也有rails_ujs.js。
  • 没错,button_to上需要delete方法。
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多