1

と の 3 つのモデルがPost, ReplyありVoteます。Voteと との多形的な関連付けPostとしてReply:

ルート.rb:

   resources :posts do
    resources :votes
    resources :replies do
      resources :votes
    end
  end
  resources :votes,         only: [:create, :destroy]

votes_controller.rb:

  def create
    @votable = find_votable
    @vote = @votable.votes.create(params[:vote])
    if @votable.save
     # vote saved
    else
      render :action => 'new'
    end
  end

  private

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

posts_controller.rb:

def show
    @post = Post.find(params[:id])
    @replies = @post.replies.paginate(page: params[:page])
    @reply = @post.replies.build
    @votable = ? # not sure what to add here
    @vote = Vote.new
 end

投稿/show.erb:

  <%= form_for ([@votable, @vote]) do |f| %>
    <p>
      <%= f.label :polarity %><br />
      <%= f.text_field :polarity %>
      <%= f.label :user_id %><br />
      <%= f.text_field :user_id %>
    </p>
    <p><%= f.submit "Submit" %></p>
  <% end %>

  <%= render 'replies/form' %>

返信/フォーム.rb:

  <%= form_for ([@votable, @vote]) do |f| %>
    <p>
      <%= f.label :polarity %><br />
      <%= f.text_field :polarity %>
      <%= f.label :user_id %><br />
      <%= f.text_field :user_id %>
    </p>
    <p><%= f.submit "Submit" %></p>
  <% end %>

@votable投稿コントローラーで定義する方法がわからないのでPost.find(params[:id])、投稿の投票フォームとReply.find(params[:id])投票の投稿フォームに対して定義します。postsrepliesの両方が同じショー ビューにあるため、これは困難です。

回避策はありますか?(または、より良いアプローチがありますか?@votable投票コントローラーで変数を作成し、ポストコントローラーで使用できるようにしますか?)

4

1 に答える 1

0

あなたがしようとしていることは、ネストされたフォームと呼ばれます。ポリモーフィックな関係は、その実装方法に影響を与えるべきではありません。以下のレールキャストを見てみてください

http://railscasts.com/episodes/196-nested-model-form-part-1

この宝石をチェックしてください

https://github.com/ryanb/nested_form

古いので、これに対する新しい宝石やアプローチがあるかもしれません。

于 2012-11-19T05:58:07.487 に答える