如何向现有控制器添加新操作?

我在Rails中很新。 抱歉,这个菜鸟问题。

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

如何向现有控制器添加“hello”和“goodbye”等新操作?

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

 # 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。

这些是您可以拥有的最简单的路线,但您可以从导轨指南查看外部路由作为可靠的信息来源。

 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 %> 

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


例:

最初创建时,控制器中已经创建了一个名为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 

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