0

例如,我有一个这样的 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?(我也编辑了上面的例子)

4

2 回答 2

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在你的控制器/视图中调用适当的参数来获取你的路径。

于 2013-06-12T09:03:46.757 回答
1

你可以使用url_for(:controller => "youtube_controller", :action => "youtubeTokenPageVideos). 另外,我对 ruby​​、rails 和约定有一些评论,希望你不介意:

在 ruby​​ 中,用 CamelCase 命名类和模块是一种惯例(就像你做的那样class YoutubeController:),但方法应该是像 .snake_case 这样的def youtube_token_page_videos

你也不应该initialize在控制器中使用。我鼓励你更多地了解 Rails 的一些基础知识,比如控制器的工作原理。一个好的起点是 rails 指南: http: //guides.rubyonrails.org/action_controller_overview.html。在这里您可以了解例如。在过滤器之前。一般来说,我不确定您在 Rails 中的经验,但http://codeschool.com有一个非常好的免费入门课程:http: //www.codeschool.com/courses/rails-for-zombies-redux .

于 2013-06-12T09:06:25.907 回答