【问题标题】:How to call a controller's method from a view?如何从视图中调用控制器的方法?
【发布时间】: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


    【解决方案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
    

    【讨论】:

    • 非常感谢您的回复。这非常有帮助:) 如果我希望按钮显示表单并基于表单字段在数据库中执行插入,我该怎么办?
    • 如果您想接受用户输入,只需 a) 设置模型,b) 为该模型运行数据库迁移,c) 设置控制器和视图以支持它。我实际上建议您阅读入门指南:guides.rubyonrails.org/…,因为它列出了其中一些步骤。如果您更喜欢投资一本书,请查看 Rails 3 in Action
    【解决方案2】:

    除了 agmcleod 的回答之外,您还可以使用 ActionController::Base::helper_method 将控制器方法暴露给视图:

    class EventsController < ApplicationController
      helper_method :join_event
    
      def join_event(event)
        # ...
      end
    end
    

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

    【讨论】:

    • 你真的不应该这样做。虽然你可以让控制器知道它的方法或多或少是理想的,但别无其他:)
    • @agmcleod 我不同意。依赖会话数据的logged_in? 控制器方法在视图层中非常有用。与大多数事情一样,您只需要知道何时使用它以及何时滥用它:-)
    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 2013-07-02
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多