从同一表单更新注释和状态

时间:2014-08-15 00:37:19

标签: ruby-on-rails ruby

我正在尝试使用Rails 4.1构建一个小费用跟踪应用。当用户提交费用请求时,默认状态会将其标记为挂起。管理员必须批准该请求。我正在使用state_machine gem来做到这一点。

我刚刚使用acts_as_commentable gem添加了评论功能,它可以自行运行。我想在同一表单中合并批准下拉列表和评论框,并在费用显示页面中使用以下代码:

<div class="row">
  <div class="col-md-8">
    <%= form_for [@expense, Comment.new] do |f| %>
      <div class="form-group">
        <%= f.label :state %><br />
        <%= f.collection_select :state, @expense.state_transitions, :event, :human_to_name, :include_blank => @expense.human_state_name, class: "form-control" %>
       </div>
       <div class="form-group">
        <%= f.label :comment %><br />
        <%= f.text_area :comment, class: "form-control" %>
       </div>
        <%= f.submit "Submit", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
<br>

问题是我得到了“费用中的NoMethodError#show - 未定义的方法`状态'代表#”。有没有办法可以一次更新审批状态和评论?

具有嵌套属性的更新后的展示页面:

<div class="row">
  <div class="col-md-8">
    <%= nested_form_for (@expense) do |f| %>
      <div class="form-group">
        <%= f.label :state %><br />
        <%= f.collection_select :state, @expense.state_transitions, :event, :human_to_name, :include_blank => @expense.human_state_name, class: "form-control" %>
       </div>
         <%= f.fields_for :comments do |comment| %>
          <div class="form-group">
            <%= comment.label :comment%>
            <%= comment.text_area :comment, class: "form-control" %>
          </div>
        <% end %>
        <%= f.submit "Submit", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

1 个答案:

答案 0 :(得分:0)

Nested attributes是你的朋友。它们很容易实现我建议避免acts_as_commentable删除不必要的依赖项,这样你才能理解正在发生的事情。

像这样使用它们:

# expense.rb
class Expense < ActiveRecord::Base
  has_many :comments # << if polymorphic add `, as: :commentable`
  accepts_nested_attributes_for :comments
end

# expenses_controller.rb
def new
  @expense = Expense.new
  @expense.comments.build
end

# expenses/new.html.haml
= form_for(@expense) do |f|
  - # expense inputs...
  = f.nested_fields_for(:comments) do |comment|
    = comment.text_area(:body)
  = f.submit

有很多选项,所以请查看the docs了解更多详情(它们非常好)。