Rails: model_url для пользовательского действия
-
29-09-2019 - |
Вопрос
Допустим, у меня есть простое приложение блога Rails.
И у меня есть индивидуальное действие, как page_views
который показывает количество просмотров пост.
class PostsController < ApplicationController
def page_views
#show some page views
end
end
И есть также связанный с этим мнение в app/views/Posts
папка.
Теперь в routes.rb
У меня есть:
map.resources :posts
map.resources :posts, :collection => {
:page_views=> :get
}
в моих постах show.html.erb
Файл у меня есть ссылка на page_views
Посмотреть:
link_to("View Page Views",page_views_posts_path + "/" + post.id.to_s)
Другой paths
:
page_views_posts_path(post)
page_views_path(post)
page_views_posts(post)
Привели либо к методу, не найденному, либо к неправильному URL, например:
http://localhost:3000/posts/page_views.#<posts:0xabcdef00>
Я бы предположил, что URL должен быть:
http://localhost:3000/posts/page_views/1
Итак, что мне здесь не хватает?
Решение
Если вы хотите предоставить page_views
Страница для каждого представления вы должны объявлять дополнительные действия не как метод сбора, а как метод участника:
map.resources :posts, :member => { :page_views=> :get }
Кроме того, если вы хотите это для всех сообщений (покажите какую -то таблицу ранжирования) добавьте тот же параметр, что и действие сбора:
map.resources :posts, :member => { :page_views=> :get }, :collection => { :page_views => :get }
Таким образом, вы получите сгенерированные маршруты:
page_views_post_path(post) # for single post
page_views_posts_path # for all posts
Вы можете проверить новые маршруты, выполнив следующую команду:
$ rake routes | grep page_views
Вы получите только эти связанные взгляды, учитывая тот факт, что вы не объявили их для других контроллеров.