Rails 3.2有条件地设置嵌套表单字段值

时间:2014-12-27 22:48:03

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

我正在建立一个音乐专辑评论网站。我有以下模型(与这篇文章相关):

  • 专辑
  • 艺术家
  • 评分
  • 用户

  • 艺术家有很多专辑

  • 相册有很多评论
  • 用户有很多评论

我的表单都设置正确,并将评论字段拉入专辑表格。一切都正确写入数据库,但我有一个问题:如果是一个新的评论,我如何动态地将user_id字段设置为current_user.id(只有用户可以创建评论,用户只会是管理员,所以会有我们2-3人),但如果这是一个现有的评论,在进入专辑#dit编辑时会留下该字段吗?

现在我有:

<div class="field">
  <%= f.number_field :user_id, value: current_user.id %>
</div>
<div class="field">
  <%= f.label :content %><br />
  <%= f.text_area :content %>
</div>

与其他字段一起,这适用于新的审核,因为user_id字段使用current_user.id值填充。但是,当我去编辑相册时,如果我手动将user_id值更改为其他内容,保存,返回并再次编辑,则会重置为我的user.id值(在本例中为1)。

现在,在Album表单上,我只使用

if @album.new_record? ... end

语句要么使用current_user.id预先填充隐藏字段,要么对现有记录不执行任何操作,因为我不希望这样做。

但是我无法弄清楚如何对嵌套字段做同样的事情并且无法通过Google搜索找到任何东西。我尝试过使用f,builder,review,@ look,self aand都导致了nil:nilClass错误。那么我怎样才能为嵌套的评论字段完成同样的事情呢?

if nested_review.new_record?
  user_id = current_user.id
else
  user_id
end

我真的希望在我只是忽略的视图中这是一件简单的事情。看起来应该是这样。

1 个答案:

答案 0 :(得分:1)

您可以访问现有的user_idf.object

以下内容可以帮助您实现目标:

<%= f.number_field :user_id, value: (f.object.user_id || current_user.id) %>

不知道为什么你把它变成了一个可编辑的字段。当然,它应该是一个隐藏的。