获取配置文件以更新并显示新提交的表单项的问题

时间:2011-09-03 03:23:51

标签: ruby-on-rails-3 forms

关注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创建了一个示例评论,当我收到要显示的个人资料时,评论的输入字段:正在使用评论的正文重新填充。关于可能发生什么的任何想法?

1 个答案:

答案 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)变量提供给部分。

下次如何避免这种情况:

我会给你两条经验法则,以避免陷入这种情况:

  1. 尝试更精确地命名变量。 @new_comment对于存储新评论的变量来说是一个更好的名称。 @comment有点暧昧,因为你认为有很多那些。

  2. 避免在视图中创建和修改实例变量(@变量),尝试仅在控制器中执行此操作。我承认,由于<% for @comment in @user.profile.comments %>,您的特定案例有点难以察觉。该视图的名称有充分的理由,它只能让您查看您在控制器中定义的数据。

  3. 希望这有帮助。