如何从Rails 3.2.13中的控制器/方法名称获取路由

时间:2013-06-12 08:34:45

标签: ruby-on-rails ruby-on-rails-3 routes

作为示例,我有一个像这样的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的路径? (我也编辑了上面的例子)

2 个答案:

答案 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