と の 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])
投票の投稿フォームに対して定義します。posts
とreplies
の両方が同じショー ビューにあるため、これは困難です。
回避策はありますか?(または、より良いアプローチがありますか?@votable
投票コントローラーで変数を作成し、ポストコントローラーで使用できるようにしますか?)