我有一个多态模型帖子,使用户能够对不同的模型发表评论。
并且用户可以在仅包含文本内容的回复模型中回复这些帖子
如果用户想要在"类别"或"主题"页面上留下帖子,则没有问题。但是,如果用户想要回复帖子,则会导致路由问题。
这里有5个模型(类别/主题/帖子/回复/用户)
代码如下
模型
models/category.rb
class Category < ActiveRecord::Base
has_many :subjects
has_many :posts, as: :postable
end
models/subject.rb
class Subject < ActiveRecord::Base
belongs_to :category
has_many :posts, as: :postable
end
models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :postable, polymorphic: true
has_many :replies
end
models/reply.rb
class Reply < ApplicationRecord
belongs_to :user
belongs_to :post
end
控制器:
controller/categories_controller.rb
def show
@postable = @category
@post = Post.new
@reply = Reply.new
end
controller/subjects_controller.rb
def show
@postable = @subject
@post = Post.new
@reply = Reply.new
end
controller/posts_controller.rb
def create
@post = @postable.posts.build(post_params)
@post.user = current_user
if @post.save
@post.reload
redirect_to @postable, notice: "Created"
else
render :new
end
end
controller/replies_controller.rb
def create
@reply = @post.replies.build(reply_params)
@reply.user = current_user
if @reply.save
redirect_to :back
else
flash[:alert] = "Sorry, something went wrong."
render user_path
end
end
视图:
views/XXX/show.html.erb
....some content of Category or Subject show page...
<% @posts.each do |post|%>
<%= link_to post.user.username, post.user %>
<%= simple_format post.content %>
<%= render partial: "replies/reply", :locals => {:post => post} %>
<% end %>
view/replies/_reply.html.erb
<% if post.replies %>
<% post.replies.each do |reply| %>
<%= link_to reply.user.username, reply.user %>
<%= simple_format reply.content %>
<% end %>
<% end %>
<%= simple_form_for :reply do |r| %>
<%= r.hidden_field :post_id, value: post.id %>
<%= r.input :content, label: false %>
<%= r.button :submit, "Submit" %>
<% end %>
我在 route.rb 文件中尝试了几种方法
either
resources :subjects do
resources :posts do
resources :replies
end
end
or
resources :replies
提交帖子的新回复后,它总是显示以下结果
没有与 [POST] "/subjects/82" 匹配的路由
我的问题是我应该在 route.rb 或其他文件上做什么来解决问题?
这样显式地传递url
simple_form_for
: -
<%= simple_form_for :reply, :url => your_create_reply_path, :method => :post do |r| %>
<%= r.hidden_field :post_id, value: post.id %>
<%= r.input :content, label: false %>
<%= r.button :submit, "Submit" %>
<% end %>
您可以检查 URL 以通过命令rake routes | grep replies
创建回复,并提供方法类型get or post