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んか?

リソースをネストするためのより良い方法があるので、私があなたなら、レール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

これはあなたが今持っているものにかなり近い何かを達成するでしょう、主な違いはそれがナメクジを含まないということです。なぜナメクジとIDの両方が必要なのかわかりません。おそらく、ナメクジによって原因を特定できるでしょうか。 Stringexはスラッグを生成するための優れた宝石であり、スラッグが一意であることが保証されるように設定できます。

ネストされたリソースに関するRailsガイドのセクションは次のとおりです http://guides.rubyonrails.org/routing.html#nested-resources

そして、ネストされたリソースでスラッグを使用することについてのRailscastがあります http://railscasts.com/episodes/314-pretty-urls-with-friendlyid?view=comments

お役に立てれば。

于 2012-05-30T21:01:04.853 に答える