作为示例,我有一个像这样的routes.rb文件
FilePicker::Application.routes.draw do
match "youtube/search/videos/:query(/:maxResults)", :to => "Youtube#youtubeVideos", :via => :get
match "youtube/searchWithToken/:query/:token(/:maxResults)", :to => "Youtube#youtubeTokenPageVideos", :via => :get
root :to => 'home#index'
end
我希望能够通过使用组合控制器/动作来恢复路线。 这样的事情:
class YoutubeController < ApplicationController
def initialize
@routeA = getRoute 'Youtube', 'youtubeVideos'
puts @routeA #=> youtube/search/videos
end
def youtubeVideos
@routeB = getRoute 'Youtube', 'youtubeTokenPageVideos'
puts @routeB #=> youtube/searchWithToken
end
def youtubeTokenPageVideos
...
end
end
这可能吗?
我不认为request.path
是解决方案,因为它会给我实际使用的路径。例如,已调用操作youtubeVideos
,从此处,如何动态获取操作youtubeTokenPageVideos
的路径? (我也编辑了上面的例子)
答案 0 :(得分:1)
你可以这样做:
class YoutubeController < ApplicationController
before_filter :set_route
def youtube_videos
#some_code
end
def youtube_token_page_videos
#some_code
end
private
def set_route
@route = url_for(:controller => :youtube,
:action => :youtube_videos,
:query => 'Some query')
end
end
您还应该修改路线以匹配此示例。感谢您使用before_filter
,您可以在此控制器的每个操作中设置@route
变量。
您也可以为路线命名,如下例所示:
#routes.rb
match "youtube/search/videos/:query(/:maxResults)", :to => "Youtube#youtube_videos", :via => :get, :as => :youtube_videos
如果您这样做,只需在控制器/视图中使用适当的参数调用youtube_videos_path
即可获得路径。
答案 1 :(得分:1)
您可以使用url_for(:controller => "youtube_controller", :action => "youtubeTokenPageVideos)
。另外,我对ruby,rails和convention有一些评论,希望你不要介意:
在ruby中,使用CamelCase命名类和模块是一种惯例(就像你做的那样:class YoutubeController
),但方法应该是像def youtube_token_page_videos
一样的snake_case。
此外,您永远不应在控制器中使用initialize
。我鼓励您了解一些Rails的基础知识,比如控制器的工作原理。一个好的起点是导轨指南:http://guides.rubyonrails.org/action_controller_overview.html。在这里你可以了解例如。在过滤之前。我不确定你在Rails中有多么有经验,但http://codeschool.com有一个非常好的免费入门课程:http://www.codeschool.com/courses/rails-for-zombies-redux。