我安排了我的路线,以便在访问网站时显示:id
之前像这样的
match "/causes/:id/:slug" => "causes#show", :as => :cause, :via => 'get'
但我也有一个名为“post”的嵌套属性属于这样的原因
match "/causes/:id/:slug/posts" => "causes#posts", :via => 'get', :as => :posts
当我使用它时,一切都适用于原因,但不适用于帖子。
如果我使用
@post = Post.find(params[:id])
在原因或帖子控制器中,它总是查找原因的ID,而不是帖子的ID。因此,如果帖子:id
为9,原因:id
为1,我使用
@post = Post.find(params[:id])
它总是会查找post[1]
而不是9或者帖子ID到底是什么。
我做错了什么?有没有办法在路由中使这个工作,或者可能以不同的方式在控制器中找到嵌套对象的id?
我需要将路线设置为:id/:slug...
rake路线信息:
cause GET /causes/:id/:slug(.:format) causes#show
edit_cause GET /causes/:id/:slug/edit(.:format) causes#edit
PUT /causes/:id/:slug(.:format) causes#update
posts GET /causes/:id/:slug/posts(.:format) causes#posts
POST /causes/:id/:slug/posts(.:format)
PUT /causes/:id/:slug/posts(.:format) causes#update_post
DELETE /causes/:id/:slug/posts(.:format) causes#destroy_post
causes GET /causes(.:format) causes#index
POST /causes(.:format) causes#create
任何帮助都会很棒。
答案 0 :(得分:1)
这是因为您使用了原因的ID,如果您正在执行/causes/:id/posts
,那么您不应该@posts = @cause.posts
吗?
如果我是你,我会研究rails 3的新路由器语法,因为有一种更好的方法来嵌套资源http://guides.rubyonrails.org/routing.html
编辑: 使用friendly_id gem并嵌套你的资源,以避免混淆遵循有关资源最终的REST最佳实践,所以
/causes/:slug/posts/:slug
答案 1 :(得分:1)
要解决您的直接问题,您需要将此类内容添加到routes.rb
# config/routes.rb
match "/causes/:cause_id/:slug/post/:id" => "causes#update_post", :via => 'put', :as => :update_post
然后你可以在你的视图中生成这样的URL ......
link_to 'Update this post', update_post_path(@cause, @post)
...并以params[:id]
(针对帖子)和params[:cause_id]
(针对原因)访问控制器中的参数。
更一般地说,你指定路线的方式非常麻烦,我怀疑你的生活比你需要的更难。如果这是我,我会做像
这样的事情# config/routes.rb
resources :causes do
resources :posts
end
这将完成一些非常接近你现在拥有的东西,主要区别在于它不会包含slu。我不确定为什么你需要有slu and和ID,也许你可以通过他们的slu that来确定你的原因? Stringex是一个很好的宝石,可以产生slu ,,你可以设置它以确保slug是唯一的。
以下是嵌套资源的Rails指南部分 http://guides.rubyonrails.org/routing.html#nested-resources
这是关于使用嵌套资源的slugs的Railscast http://railscasts.com/episodes/314-pretty-urls-with-friendlyid?view=comments
希望这有帮助。