2011-12-09 11 views
1

私はまだRailsで自分のストライプを稼いでいて、何か助けを必要とする問題に遭遇しました。私は、ユーザーがコメントできるさまざまなモデル(ストーリー、写真、アートワークなど)とコメントそのものを持つアプリケーションを構築しています。私は機能している機能の98〜99%を持っていますが、コメントが作成された後にリダイレクトが最上位の親(ストーリー、写真など)にリダイレクトされるのを止めています。Rails 3再帰的多態性コメントモデル、最上位の親にリダイレクトする方法

私のコメントモデルは次のようになります。

# /app/models/comment.rb 
class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true 
    has_many :comments, :as => :commentable 
end 

...私は例えばユーザーがコメントすることができ、いくつかのモデル、物語のモデルがあります:

# /app/models/story.rb 
class Story < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

を私のコメントコントローラは次のようになりますこの時点で:

# /app/controllers/comments_controller.rb 
class CommentsController < ApplicationController 

    def index 
    @commentable = find_commentable 
    @comments = @commentable.comments 
    end 

    def new 
    @commentable = find_commentable 
    end 

    def create 
    @commentable = find_commentable 
    @comment = @commentable.comments.build(params[:comment]) 
    if @comment.save 
     redirect_to :back 
    else 
     render :action => 'new' 
    end 
    end 

    protected 

    def find_commentable 
    params.each do |name, value| 
     if name =~ /(.+)_id$/ 
     return $1.classify.constantize.find(value) 
     end 
    end 
    nil 
    end 

end 

...もちろん私のルートは次のようになります。

# /config/routes.rb 
resources :comments do 
    resources :comments 
end 

resources :stories do 
    resources :comments 
end 

私は変更する必要がある特定の行がredirect_to :backライン(など他のすべて、多型、コメントの再帰は、正常に動作します)です。現在のコードは、ユーザーがストーリーにコメントしているときに意図したとおりに機能しますが、その機能のフォームがストーリーの「表示」ページにないため、ユーザーがコメントにコメントしているときには理想的ではありません。

私は何をやろうとしているのですか(また、解決策があると思われるもの)は、親オブジェクトを見つけてそのオブジェクトがコメントであるときに再帰するメソッドです。これまでの私のこれまでの試みはまったくきれいではなかったし、まだ動作するプロトタイプを手に入れたことはない。

は、私は私のコードの大部分をベースに、この railscasts episodeを使用しますが、それはおそらく何かがと間違っている(コメントを構築しようとしたとき redirect_to :id => nilは何とかと呼ばれる作成コメント方法として私のために動作しませんし、それが NilClass errorになり私のルーティングは、私はインデックスアクションがどのようにcreateと呼ばれるのか分かりません)。

だから私は間違っているのですか?これを実現するにはここで何をする必要がありますか?私は私が99%そこにいるように感じるが、その最後の1%は私を夢中にさせている。私はこれを数回を読んでする必要がありました

答えて

1

OK事前に

おかげで... ...

@comment.commentable 

は、ストーリーのインスタンスやコメントをしたものは何でもオブジェクトを返します。

私が最初のコメントコントローラのメソッドを追加しました...

def get_master 
    @parent = @comment.commentable 
    if @parent.respond_to?('commentable_type') 
    @comment = @parent 
    get_master 
    else 
    return @parent 
    end 
end 

は、その後、私はこのメソッドを呼び出すために私のredirect_toを変更:これは...それはおそらく最もクリーンではないのですが、それは動作します解決

+0

確かに、これは間違いなくソリューションの一部です。私は、コメントが(潜在的に)一連の他のコメントの下に入れ子になっているときに再帰でこれを行う必要があります。 – Ryan

1

コントローラを作成します。

キーは@ object.respond_toを理解していましたか?私はメソッドが定義されているかどうかをチェックする必要があった。ここで

は、それがどのように動作するかの完全な例です:http://t.co/N6WIGzuW

関連する問題