2012-04-24 91 views
1

我正在Ruby-On-Rails上开发一个小应用程序。我想从视图中调用控制器的方法。该方法只会在数据库表中执行一些插入操作。什么是正确的方法来做到这一点?我已经试过这样的事情,但显然不执行方法代码:如何从视图调用控制器的方法?

<%= link_to 'Join', method: join_event %> 

回答

5

中的link_to方法调用该方法的选择实际上是HTTP方法,而不是动作的名称。这对于传递HTTP删除选项很有用,因为RESTful路由使用DELETE方法来执行destroy操作。

你需要在这里做什么,为你的行动设置一个路线。假设它被称为join_event,以下内容添加到您的routes.rb:

match '/join_event' => 'controllername#join_event', :as => 'join_event' 

一定要改变controllername您所使用的控制器的名称。然后更新您的视图,如下所示:

<%= 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 
+0

非常感谢您的回复。这非常有帮助:)如果我希望按钮显示表单并基于表单字段在数据库中执行插入操作,我该怎么办? – notGeek 2012-04-25 18:16:35

+0

如果您想接受用户输入,则需要a)设置模型,b)为该模型运行数据库迁移,以及c)设置控制器和视图以支持该模型。实际上,我建议您阅读入门指南:http://guides.rubyonrails.org/getting_started.html#getting-up-and-running-quickly-with-scaffolding,因为它列出了其中的一些步骤。如果你愿意投资一本书,可以看看Rails 3的行动 – agmcleod 2012-04-26 02:52:24

4

除了agmcleod的回答,您可以公开的控制器方法与ActionController::Base::helper_method的观点:

class EventsController < ApplicationController 
    helper_method :join_event 

    def join_event(event) 
    # ... 
    end 
end 

但在这种情况下,我想你最好按照他的建议,并提出这个方法的模型层,因为它的INTE与数据库发生冲突。

+0

你真的不应该这样做。虽然你可以或多或少的理想,让控制器知道它的方法,而没有其他的:) – agmcleod 2012-04-26 02:49:54

+2

@agmcleod我不同意。取决于会话数据的'logged_in?'控制器方法在视图层中非常有用。与大多数事情一样,您只需知道何时使用它以及何时滥用它:-) – Brandan 2012-04-26 12:53:07

相关问题