Как заставить мое приложение перейти в этот пользовательский вид? - PullRequest
0 голосов
/ 12 апреля 2011

У меня есть это настраиваемое действие в контроллере моего видео:

def upvoted_songs
  @votes = current_user.videos_votes.where("value = 1")
  @videos = @votes.videos.page(params[:page]).per(15)
end

Это мои маршруты:

resources :videos do
    member do
      put 'topic_update'
      get 'upvoted_songs'
    end
end

И эта ссылка в моем указателе просмотра видео:

<%= link_to "Upvoted Songs", videos_path, :action => "upvoted_songs", :class => "upvoted_songs chosen_home_option" %>

и файл представления с именем videos / upvoted_songs.html.erb.

Почему ссылка не указывает на представление upvoted_songs.html.erb, а скорее остается в представлении индекса видео?

ОБНОВЛЕНИЕ:

Это мои маршруты.rb:

root :to => "videos#index"
resources :video_votes
resources :videos do
    resources :comments
    member do
      put 'topic_update', :on => :member
      get 'upvoted_songs', :on => :collection, :as => 'upvoted'
    end
end
resources :comment_titles
resources :users
resources :profiles
resources :genres
resources :topics
resources :topicables
resource :session

Сначала я получаю эту ошибку:

ArgumentError

can't use member outside resource(s) scope

Затем после обновления страницы я получаюэта ошибка:

ActionController::RoutingError in Videos#index

Showing /rubyprograms/dreamstill/app/views/videos/_video.html.erb where line #22 raised:

No route matches {:action=>"show", :id=>#<Video id: 485, title: "I'm Ready For You", description: nil, embed_code: nil, thumbnail_url: nil, released: nil, user_id: 57, created_at: "2011-04-02 08:47:36", updated_at: "2011-04-09 22:42:48", video_url: "http://www.youtube.com/watch?v=wy86KNtOjVg", video_votes_count: 0, vote_sum: 3, rank_sum: 28927.724512>, :controller=>"videos"}

22: <%= link_to video.title, video_path(video), :class => "normal" %>

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

Чтобы увидеть, какие маршруты доступны для использования в вашем приложении, используйте rake routes в командной строке в корневом каталоге приложения. Вы должны увидеть строку, которая ссылается на upvoted_songs.

Тогда используйте это так:

<%= link_to "Upvoted Songs", upvoted_songs_video_path(video), :class => "upvoted_songs chosen_home_option" %>

Поскольку у вас есть маршрут member , помощник URL возьмет видеообъект (или идентификатор) и сгенерирует URL, который будет выглядеть примерно так: /videos/7/upvoted_songs

Однако ваш код предполагает, что вы, возможно, делаете что-то, что не зависит от одного видеообъекта, и вам также не понадобится это в URL. Таким образом, вы захотите изменить этот маршрут с участника маршрута на collection маршрута. Тогда URL будет выглядеть примерно как /videos/upvoted_songs, и вы не передадите ему видеообъект.

Надеюсь, это поможет:)

ЧАСТЬ 2

Снять блок участника:

resources :videos do
  resources :comments
  put 'topic_update', :on => :member
  get 'upvoted_songs', :on => :collection, :as => 'upvoted'
end
2 голосов
/ 12 апреля 2011

Вы ссылаетесь на videos_path, который является помощником для "videos # index".

Как объяснил ctcherry, ваш текущий маршрут использует маршрут участника, а не коллекцию. Следующее больше того, что вы ищете:

resources :videos do
  put 'topic_update', :on => :member
  get 'upvoted_songs', :on => :collection, :as => 'upvoted'
end

Тогда вы можете использовать upvoted_videos_path вместо videos_path.

1 голос
/ 12 апреля 2011

У вас нет идентификатора.Есть ли грабли на маршрутах |grep upvoted и посмотрите, как должен выглядеть ваш маршрут.

это, вероятно, что-то вроде upvoted_songs_video_path(video)

...