我正在尝试使用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>
答案 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了解更多详情(它们非常好)。