为什么我不能在这里构建多个嵌套属性?

时间:2011-04-03 20:35:52

标签: ruby-on-rails ruby ruby-on-rails-3 nested-attributes

这是我的表单代码:

<%= 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_titlesaccepts_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

1 个答案:

答案 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操作中添加新项目,这可能会让某些用户反直觉。