我有两个模型:Books
并且pages
是典型的 one_to_many 关系。
我怎样才能使以下
page_path(@page)
输出此路径:
bookname/page/pageid
代替
page/pageid
如果我覆盖 to_param,我所能做的就是制作一条类似的路径,localhost/page/bookid/pageid
但这不是我想要的。
我有两个模型:Books
并且pages
是典型的 one_to_many 关系。
我怎样才能使以下
page_path(@page)
输出此路径:
bookname/page/pageid
代替
page/pageid
如果我覆盖 to_param,我所能做的就是制作一条类似的路径,localhost/page/bookid/pageid
但这不是我想要的。
不确定是否可以获得您想要的内容,但您可以将 Page 设置为 book 下的嵌套资源,如下所示:
resources :books do
resources :pages
end
然后你会得到:
localhost/book/bookid/page/pageid
然后你可以覆盖 `to_param' 来获得:
localhost/book/bookid-bookname/page/pageid
我假设您的意思是路径为 /:book_name/page/:id
在 routes.rb 中:
match '/:book_name/page/:id' => "page#show", :as => :page
在控制器中,您将访问 params[:id] 以获取 page.id 和 params[:book_name] 以获取书名。
我发现要完全控制路径助手,您必须覆盖application_helper.erb
文件中的那些。以下代码对我有用:
def pages_path(@page)
@bookpath = Book.find(@page.book_id)
@bookpath + '/page/' + @page.id
end
助手只创建路径。您仍然需要将其链接到routes.rb
. 您甚至可以将pages
资源嵌套在books
资源中。唯一重要的是,上述助手生成的路径必须能够被 rails 应用程序识别。