31

我是 Rails 的新手。对不起菜鸟问题。

我创建了一个新控制器:rails new controller Say hello goodbye

我如何向这个现有的控制器添加一个新的动作,比如“你好”和“再见”?

4

4 回答 4

59

添加新动作很简单。您所要做的就是在控制器上添加一个方法,例如:

# app/controllers/dummy_controller.rb
def get_back
  logger.warn "It works!"
  redirect_to :back
end

现在,为了能够通过 URL 访问此操作,您需要为此设置路由。这是在您的config/routes.rb文件中完成的。您可以将其添加为硬路由,例如

get '/go_back', to: "dummy#get_back"

这是最简单的可能路线。但是您可能希望它表现得像一条宁静的路线。如果您对一个或多个模型执行操作,这很有用。所以在你的路由文件中,你会有这样的东西:

resources :dummy do
  collection do
    get 'get_back'
  end
end

这允许您接受get集合上的方法。您将拥有帮助dummy_go_back_url程序,并且要访问此页面的 url 是/dummies/go_back

这是为了对资源集合进行操作。如果您正在对一个特定对象进行操作,则应指定一个member操作:

resources :dummy do
  member do
    get 'get_back'
  end
end

由于成员操作仅针对一个对象,因此您将拥有一个类似/dummies/123/go_back. 这会自动将params[:id]控制器中的变量设置为123,让您轻松获取对象。此外,dummy_go_back_path定义了帮助方法,并接收一个对象或 id 作为参数以生成正确的 url。

这些是您可以拥有的最简单的路线,但您可以从 Rails 指南中查看从外到内的路线作为可靠的信息来源。

于 2013-09-09T17:15:08.323 回答
9
def hello
  @hello = "hello"
end

def goodbye
  @goodbye = "goodbye"
end

然后在/config/routes.rb

get 'foo/hello'       ## foo is the name of your controller
get 'foo/goodbye'

记住也要创建视图: views/foo/hello.html.erb可能看起来像这样:

Say <%= @hello %>

views/foo/goodbye.html.erb可能看起来像这样:

 Say <%= @goodbye %>
于 2013-09-09T17:14:10.583 回答
5

当您generate使用另一个方法的名称重复该命令时,您可以跳过覆盖现有控制器及其测试实现。这将自动添加路线并创建一个视图。之后,您必须手动将方法添加到控制器,因为该操作没有触及控制器文件。

Rails 6.1 的附加信息在下面的评论中。


例子:

new最初创建控制器时,已在控制器中创建了一种方法:

$ rails generate controller Person new
... successfully created the controller, it's route and view ...

尝试添加新方法时:

$ rails generate controller Person all
Running via Spring preloader in process 28648
    conflict  app/controllers/person_controller.rb
Overwrite ../app/controllers/person_controller.rb? (enter "h" for help) [Ynaqdh] h
    Y - yes, overwrite
    n - no, do not overwrite
    a - all, overwrite this and all others
    q - quit, abort
    d - diff, show the differences between the old and the new
    h - help, show this help
Overwrite ../app/controllers/person_controller.rb? (enter "h" for help) [Ynaqdh] n
        skip  app/controllers/person_controller.rb
       route  get 'person/all'
      invoke  erb
       exist    app/views/person
      create    app/views/person/all.html.erb
      invoke  test_unit
    conflict    test/controllers/person_controller_test.rb
Overwrite ../test/controllers/person_controller_test.rb? (enter "h" for help) [Ynaqdh] n
        skip    test/controllers/person_controller_test.rb
      invoke  helper
   identical    app/helpers/person_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
   identical      app/assets/javascripts/person.coffee
      invoke    scss
   identical      app/assets/stylesheets/person.scss
于 2016-09-28T08:37:52.640 回答
0

您只需打开控制器文件(在 app/controllers/ 中)并在那里定义新方法。但是,如果您按照您编写的方式生成了这个控制器(say_controller),那么这两个操作应该已经存在。

于 2013-09-09T17:08:02.720 回答