我有一个基本的博客网站,我想让用户提供更正'发帖(只是把它当作评论)。修正对象属于一个帖子,而该帖子又属于一个用户(我使用的是Devise)。
我希望该表单能够创建一个新的更正嵌套在帖子的页面中,所以我只是使用<% render :template => "corrections/new" %>
在posts / show.html.erb中呈现表单。我得到了一个未定义的方法model_name&#39;但是,来自更正/ new.html.erb中的行form_for行的错误。
以下表格:
<% form_for [@correction, :url=> user_post_corrections_path(current_user, @post, @correction)], html: { multipart: true} do |f| %>
<div class="field">
<%= f.label :correction %>
<%= f.text_field :correction %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
这里是corrections_controller:
class CorrectionsController < ApplicationController
def new
@post = Post.find(params[:post_id])
@correction = current_user.@post.corrections.build
respond_with(@correction)
end
def create
@post = Post.find(params[:post_id])
@correction = current_user.@post.corrections.build
if @correction.save
redirect_to user_post_path(current_user, @correction.post_id)
end
end
end
在我的routes.rb中:
resources :users do
resources :posts do
resources :corrections
end
end
非常感谢任何帮助。
答案 0 :(得分:2)
我可以看到几个问题,首先是关闭:
表单未呈现: 应该评估表格不计算,因此您应该使用&lt;%=%&gt;标记而不是&lt; %%&gt;标签,所以它变成:
<%= form_for @correction, url: user_post_corrections_path(current_user, @post, @correction), html: { multipart: true} do |f| %>
第二:你说的是form_for @correction,你说这个表单显示在posts / show中,这意味着post的show动作应该在其控制器中有以下内容:
@correction = Correction.new user: current_user, post: @post
这假设您使用@post变量进行后期展示意味着您有类似
的内容@post = Post.find params[:id]
此行完全关闭
@correction = current_user.@post.corrections.build
你可以说:
@correction = Correction.new correction_params
@correction.user = current_user
@correction.post = @post
if @correction.save
redirect_to user_post_path(current_user, @correction.post_id)
end
重要的部分是你在post控制器上的show动作,它具有@correction对象的初始化。
答案 1 :(得分:1)
此行显示:
@correction = current_user.@post.corrections.build
@post
是一个实例变量,而不是current_user
您是否打算与当前用户建立正确的用户?以下应该有效:
@post.corrections.build(user: current_user)
如果您的更正模型has_many :users, through: :posts
,那么以下内容应该有效:
@post.corrections.build(users: [current_user])
修改强>
form_for的格式也不正确。 url:
中的form_for
密钥不属于资源数组(form_for中的第一个arg)
以下修改应解决错误,前提是user_post_corrections_path
需要:id
,:post_id
和:correction_id
form_for @correction, url: user_post_corrections_path(current_user, @post, @correction), html: { multipart: true} do |f|
如果可能,我还会将您的路由减少到两个嵌套级别。
也许这更容易?
resources :posts do
resources :corrections
end
end
如果它暗示帖子属于current_user
,则可能没有必要在路径路径中包含/users
。