这是我的表单代码:
<%= simple_form_for setup_video(@video) do |f| %>
<% f.fields_for :comment_titles do |t| %>
<%= t.input :title, :label => "Comment Title:" %>
<%= t.button :submit, :value => 'Add', :id => 'add_comment_title' %>
<div class='hint'>Let your listeners know what comments you want by adding a guiding title for them. Pose a question, ask for feedback, or anything else!</div>
<% end %>
<% end %>
我的模型中有has_many :comment_titles
和accepts_nested_attributes_for :comment_titles, :comments
。当我在表单中创建一个新的comment_title时,旧的将被替换。我想再建一个。我怎么能这样做?
以下是视频控制器操作:
def new
@video = Video.new
respond_to do |format|
format.js do
render_to_facebox(:partial => 'add_video')
end
end
end
def create
@video = current_user.videos.new(params[:video])
respond_to do |format|
if @video.save
format.html { redirect_to(@video) }
else
format.html { render :action => "new" }
end
end
end
我认为这实际上是需要的:
def update
@video = current_user.videos.find(params[:id])
respond_to do |format|
if @video.update_attributes(params[:video])
format.html { redirect_to(@video) }
format.js
else
format.html { render :action => "edit" }
end
end
end
答案 0 :(得分:0)
此处的edit
操作将提供一个表单,允许您编辑现有记录及其嵌套属性。这就是它取代现有对象的原因。
如果您只想让人们添加新评论标题,那么我建议您在edit
操作中构建一个新对象,如下所示:
def edit
video = current_user.videos.find(params[:id])
video.comment_titles.build
end
然后,这将在fields_for
来电中作为附加行提供。要仅显示此对象:
<% f.fields_for :comment_titles do |t| %>
<% if t.object.new_record? %>
# stuff goes here
<% end %>
<% end %>
但是,这限制了人们只能在edit
操作中添加新项目,这可能会让某些用户反直觉。