如何从视图中调用控制器的方法?

not*_*eek 1 ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我正在Ruby-On-Rails中开发一个小应用程序.我想从视图中调用控制器的方法.此方法仅在数据库表中执行一些插入.这样做的正确方法是什么?我尝试过类似的东西,但显然方法代码没有执行:

<%= link_to 'Join', method: join_event %>
Run Code Online (Sandbox Code Playgroud)

agm*_*eod 5

link_to方法调用中的方法选项实际上是HTTP方法,而不是操作的名称.它在传递HTTP Delete选项时很有用,因为RESTful路由使用DELETE方法来命中destroy操作.

你需要做的是为你的行动设置一条路线.假设它已被调用join_event,请将以下内容添加到routes.rb中:

match '/join_event' => 'controllername#join_event', :as => 'join_event'
Run Code Online (Sandbox Code Playgroud)

务必将controllername更改为您正在使用的控制器的名称.然后按如下方式更新您的视图:

<%= link_to 'Join', join_event_path %>
Run Code Online (Sandbox Code Playgroud)

_path方法是基于routes文件中的as值生成的.

要组织代码,您可能希望将插入封装到静态模型方法中.因此,如果您有一个名为MyModelcolumn 的模型,那么您可以这样做

class MyModel
  # ...
  def self.insert_examples
    MyModel.create(:name => "test")
    MyModel.create(:name => "test2")
    MyModel.create(:name => "test3")
  end
end
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式在您的操作中执行:

MyModel.insert_examples
Run Code Online (Sandbox Code Playgroud)


Bra*_*dan 5

除了 agmcleod 的答案之外,您还可以使用以下命令将控制器方法公开给视图ActionController::Base::helper_method

class EventsController < ApplicationController
  helper_method :join_event

  def join_event(event)
    # ...
  end
end
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我认为您最好遵循他的建议并将此方法移至模型层,因为它与数据库交互。

  • @agmcleod我不同意。依赖于会话数据的“logged_in?”控制器方法在视图层中非常有用。与大多数事情一样,您只需要知道何时使用它以及何时滥用它:-) (2认同)