1

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

耙路线信息:

                 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

任何帮助都会很棒。

4

2 回答 2

1

这是因为您正在使用原因的 id,如果您正在这样做,您/causes/:id/posts不应该这样做@posts = @cause.posts吗?

如果我是你,我会研究 Rails 3 的新路由器语法,因为有更好的方法来嵌套资源http://guides.rubyonrails.org/routing.html


编辑:使用friendly_id gem并嵌套你的资源,以避免混淆遵循REST最佳实践,有问题的资源在最后,所以

/causes/:slug/posts/:slug
于 2012-05-28T22:58:25.297 回答
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

这将完成与您现在所拥有的非常接近的事情,主要区别在于它不包含蛞蝓。我不确定为什么您需要同时拥有 slug 和 ID,也许您可​​以通过它们的 slug 来确定您的原因? Stringex是一个很好的生成 slug 的 gem,你可以设置它以保证 slug 是唯一的。

这是 Rails 指南中关于嵌套资源的部分 http://guides.rubyonrails.org/routing.html#nested-resources

这是一个关于使用嵌套资源的 slug 的 Railscast http://railscasts.com/episodes/314-pretty-urls-with-friendlyid?view=comments

希望这可以帮助。

于 2012-05-30T21:01:04.853 回答