Rails 3找到正确的:使用特定路由的控制器中的id

时间:2012-05-28 20:26:23

标签: ruby-on-rails ruby-on-rails-3 controller routes nested-attributes

我安排了我的路线,以便在访问网站时显示: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

任何帮助都会很棒。

2 个答案:

答案 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

希望这有帮助。