关注previous question,我有一些问题要解决,然后我会在我的个人资料中显示并提交安全评论表单。我是编程的初学者,所以跨多个控制器的思考似乎让我迷失了。
我正在做的是在表单中发表评论,然后列出它们。
背景:_comment_form
和_comment
作为Profile
中的部分内容。 (我的下一个任务是从大约切换到其他个人资料信息,但这完全是another question。)
使用我上一个问题中提供的帮助,我觉得我差点儿就出现了错误。
CreateComments迁移:
t.integer :profile_id
t.integer :author_id
t.string :body
我的评论模型:
class Comment < ActiveRecord::Base
belongs_to :profile
belongs_to :author, :class_name =>"User", :foreign_key => "author_id"
end
CommentsController:
def create
@comment = Comment.new(params[:comment].merge(:author_id => current_user.id))
@comment.save!
redirect_to profile_path(@comment.profile)
end
ProfilesController:
def create
@profile = Profile.new(params[:profile])
if @profile.save
redirect_to profile_path(@profile), :notice => 'User successfully added.'
else
render :action => 'new'
end
end
def show
@user = User.find(params[:id])
@profile = @user.profile
@comment = @profile.comments.new
end
评论部分内部的部分内容:
<div id="commentEntry">
<%= render :partial => 'comment', :collection => @profile.comments %>
</div>
<div id="newitem">
<%= render :partial => 'comment_form' %>
</div>
routes.rb中:
resources :users do
resources :profiles
end
resources :comments
_comment_form.html.erb:
<%= form_for @comment do |f| %>
<%= f.text_field :body %>
<%= f.submit 'Add new' %>
<% end %>
_comment.html.erb:
<li class="comment" title="<%= @comment.author.profile.first_name %> <%= @comment.author.profile.last_name %>">
<%= @comment.body %>
</li>
所以,问题#1:在循环_comment.html.erb
中包含<% for @comment in @user.profile.comments %>
会显示个人资料,但当我尝试提交新评论时,我会收到“未知操作动作找不到“CommentController”的“更新”。如果我拿走了循环,那么配置文件就不显示了,我得到了“Profiles中的NoMethodError #nite undefined method`profile'for nil:NilClass”。谁能帮我解释我做错了什么?
问题#2:我在rails console
创建了一个示例评论,当我收到要显示的个人资料时,评论的输入字段:正在使用评论的正文重新填充。关于可能发生什么的任何想法?
答案 0 :(得分:1)
您的问题的简短说明:
您@comment
部分中的_comment_form
已经保存在您的数据库中,因此调用update
操作和已填充的正文。
您在@comment = @profile.comments.new
操作中使用show
创建了新评论,但在其他地方被覆盖了。
你提到你将_comment
渲染包裹在<% for @comment in @user.profile.comments %>
的循环中,问题很可能就在那里。
<强>修正:强>
你唯一需要改变的是_comment
偏向(没有你添加的for循环):
<li class="comment" title="<%= comment.author.profile.first_name %> <%= comment.author.profile.last_name %>">
<%= comment.body %>
</li>
当您执行render :partial => 'comment', :collection => @profile.comments
时,rails非常智能,可以遍历@profile.comments
并将comment
(不 @comment
)变量提供给部分。
下次如何避免这种情况:
我会给你两条经验法则,以避免陷入这种情况:
尝试更精确地命名变量。 @new_comment
对于存储新评论的变量来说是一个更好的名称。 @comment
有点暧昧,因为你认为有很多那些。
避免在视图中创建和修改实例变量(@
变量),尝试仅在控制器中执行此操作。我承认,由于<% for @comment in @user.profile.comments %>
,您的特定案例有点难以察觉。该视图的名称有充分的理由,它只能让您查看您在控制器中定义的数据。
希望这有帮助。