我正在尝试创建包含rails中的另一个模型的表单。我已经通过使用accepts_nested_attibutes完成了这项工作,而且效果很好。问题是,我在该表中有一个额外的字段,记录每个注释的用户名,我不确定在创建新注释时如何插入该信息。用户名由应用程序控制器使用"current_user"方法提供。
问候,
Kyle
注释模型
class Comment < ActiveRecord::Base
belongs_to :post
before_save :set_username
private
def set_username
self.created_by = current_user
end
end
应用程序控制器(这只是一个沙盒应用程序,所以我只在方法中放了一个字符串(
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
def current_user
"FName LName"
end
end
显示视图
<p id="notice"><%= notice %></p>
<p>
<b>Title:</b>
<%= @post.title %>
</p>
<div id="show_comments"><%= render 'comments' %></div>
<div id="add_comments">
Add Comment
<%= form_for @post, :url => {:action => 'update', :id => @post.id}, :html => { :'data-type' => 'html', :id => 'create_comment_form' } do |f| %>
<%= f.fields_for :comments, @new_comment do |comment_fields| %>
<%= comment_fields.text_area :content %>
<%end%>
<div class="validation-error"></div>
<%= f.submit %>
<% end %>
</div>
后控制器
def update
@post = Post.find(params[:id])
respond_to do |format|
if @post.update_attributes(params[:post])
@comments = @post.comments.all
format.html { redirect_to({:action => :show, :id => @post.id}, :notice => 'Post was successfully created.') }
format.xml { render :xml => @post, :status => :created, :location => @post }
else
format.html { render :action => "new" }
format.xml { render :xml => @post.errors, :status => :unprocessable_entity }
end
end
end
我最初认为可以在模型中将其设置为默认值或before_save。但模型无法访问current_user
。因此,最好只在控制器中设置当前用户。它不像把它放在模型中那样枯燥,但它没有那么粗糙,而且以这种方式存在潜在的问题。
def update
@post = Post.find(params[:id])
@post.attributes = params[:post]
@post.comments.each do |comment|
comment.created_by = current_user if comment.new_record?
end
respond_to do |format|
if @post.save
@comments = @post.comments.all
format.html { redirect_to({:action => :show, :id => @post.id}, :notice => 'Post was successfully created.') }
format.xml { render :xml => @post, :status => :created, :location => @post }
else
format.html { render :action => "new" }
format.xml { render :xml => @post.errors, :status => :unprocessable_entity }
end
end
end
我只想指出,在模型范围内访问current_user
是可能的。在这种情况下,我认为没有必要,因为@aNoble的解决方案应该有效。因此,如果可以从控制器设置current_user,我更喜欢这样。
简而言之,我们在User
类中添加了一个方法
class User < ActiveRecord::Base
cattr_accessor :current_user
def self.current_user
@current_user ||= User.new("dummy-user")
end
...
end
在您的应用程序控制器中,我们添加了一个before_filter
来设置它。请确保在您的身份验证完成后调用此筛选器。
class ApplicationController < ActionController::Base
before_filter { |c| User.current_user = current_user }
end
然后,在你的Comment
模型中,你可以做一些类似的事情
class Comment
before_create :set_user
def set_user
created_by = User.current_user unless created_by
end
end
(所以我只在尚未设置created_by
的情况下设置它,并且只在创建新注释时设置它(。