【发布时间】:2012-04-24 23:53:02
【问题描述】:
我正在用 Ruby-On-Rails 开发一个小型应用程序。我想从视图中调用控制器的方法。此方法只会在数据库表中执行一些插入操作。这样做的正确方法是什么?我已经尝试过这样的事情,但显然方法代码没有执行:
<%= link_to 'Join', method: join_event %>
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1
我正在用 Ruby-On-Rails 开发一个小型应用程序。我想从视图中调用控制器的方法。此方法只会在数据库表中执行一些插入操作。这样做的正确方法是什么?我已经尝试过这样的事情,但显然方法代码没有执行:
<%= link_to 'Join', method: join_event %>
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1
link_to 方法调用中的方法选项实际上是 HTTP 方法,而不是操作的名称。它在传递 HTTP 删除选项时很有用,因为 RESTful 路由使用 DELETE 方法来执行销毁操作。
您需要在此处为您的操作设置路线。假设它被称为join_event,请将以下内容添加到您的 routes.rb 中:
match '/join_event' => 'controllername#join_event', :as => 'join_event'
请务必将控制器名称更改为您正在使用的控制器的名称。然后按如下方式更新您的视图:
<%= link_to 'Join', join_event_path %>
_path 方法是根据路由文件中的 as 值生成的。
要组织代码,您可能希望将插入封装到静态模型方法中。因此,如果您有一个名为 MyModel 且带有名称列的模型,您可以这样做
class MyModel
# ...
def self.insert_examples
MyModel.create(:name => "test")
MyModel.create(:name => "test2")
MyModel.create(:name => "test3")
end
end
然后只需通过以下方式在您的操作中执行它:
MyModel.insert_examples
【讨论】:
除了 agmcleod 的回答之外,您还可以使用 ActionController::Base::helper_method 将控制器方法暴露给视图:
class EventsController < ApplicationController
helper_method :join_event
def join_event(event)
# ...
end
end
但在这种情况下,我认为你最好听从他的建议,并将此方法移至模型层,因为它与数据库交互。
【讨论】:
logged_in? 控制器方法在视图层中非常有用。与大多数事情一样,您只需要知道何时使用它以及何时滥用它:-)