Cal*_*ils 27 ruby ruby-on-rails
我在Rails中很新.抱歉,这个菜鸟问题.
我创建了一个新的控制器: rails new controller Say hello goodbye
如何向现有控制器添加"hello"和"goodbye"等新操作?
fot*_*nus 52
添加新动作很简单.您所要做的就是在控制器上添加一个方法,例如:
# app/controllers/dummy_controller.rb
def get_back
logger.warn "It works!"
redirect_to :back
end
Run Code Online (Sandbox Code Playgroud)
现在,为了能够通过URL访问此操作,您需要有一个路由.这是在您的config/routes.rb文件中完成的.您可以将其添加为硬路线,例如
get '/go_back', to: "dummy#get_back"
Run Code Online (Sandbox Code Playgroud)
这是最简单的路线.但是你可能希望它表现得像一条宁静的路线.如果您对一个或多个模型执行操作,这将非常有用.所以你的路线文件,你将有这样的东西:
resources :dummy do
collection do
get 'get_back'
end
end
Run Code Online (Sandbox Code Playgroud)
这允许您接受get集合上的方法.您将拥有帮助程序dummy_go_back_url,并且到达此页面的URL是/dummies/go_back.
这是为了对一组资源进行操作.如果您对一个特定对象执行操作,则应指定一个member操作:
resources :dummy do
member do
get 'get_back'
end
end
Run Code Online (Sandbox Code Playgroud)
由于成员操作仅适用于一个对象,因此您将拥有一个类似的URL /dummies/123/go_back.这会自动将params[:id]控制器中的变量设置为123,以便您轻松获取对象.此外,dummy_go_back_path定义了辅助方法,并接收一个对象或id作为参数以生成正确的url.
这些是您可以拥有的最简单的路线,但您可以从导轨指南中查看外部路由作为可靠的信息来源.
def hello
@hello = "hello"
end
def goodbye
@goodbye = "goodbye"
end
Run Code Online (Sandbox Code Playgroud)
然后在 /config/routes.rb
get 'foo/hello' ## foo is the name of your controller
get 'foo/goodbye'
Run Code Online (Sandbox Code Playgroud)
请记住也要创建视图:
views/foo/hello.html.erb可能如下所示:
Say <%= @hello %>
Run Code Online (Sandbox Code Playgroud)
views/foo/goodbye.html.erb 可能看起来像这样:
Say <%= @goodbye %>
Run Code Online (Sandbox Code Playgroud)
当您generate使用另一个方法的名称重复该命令时,您可以跳过覆盖现有控制器及其测试实现。这将自动添加路线并创建视图。之后,您必须手动将方法添加到控制器,因为该操作没有触及控制器文件。
Rails 6.1 附加信息在下面的评论中。
例子:
一个被调用的方法new在最初创建时已经在控制器中创建了:
$ rails generate controller Person new
... successfully created the controller, it's route and view ...
Run Code Online (Sandbox Code Playgroud)
尝试添加新方法时:
$ 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25418 次 |
| 最近记录: |