Rails 嵌套形式 -> 根据值进行不同处理

Rails nested forms -> different treatment depending on value

我有一个关于嵌套表单的棘手问题。就说我有以下型号:

  1. 餐厅
  2. 员工,其中员工belongs_to家餐厅。

我在员工模型中也有两种类型的员工,

  1. 经理
  2. 员工

managersemployees模型中通过manager属性指定,是boolean

当我去编辑每个餐厅的员工列表时,它是通过一个嵌套表单,即:

<%= f.simple_fields for :employees do |f| %>
  <%= render 'employee_fields', :f => f %>
<% end %>

我的问题:有没有办法根据员工的类型呈现不同的部分表单?例如,如果当前员工是经理,则

<%= render 'manager_fields', :f => f %>. 

否则,如果当前员工是职员,则

<%= render 'staff_fields', :f => f %>.

您可以通过执行以下操作来实现条件渲染:

<%= f.simple_fields for :employees do |f| %>
  <% if f.object.manager? %>
    <%= render 'manager_fields', :f => f %>
  <% elsif f.object.staff? %>
    <%= render 'staff_fields', :f => f %>        
  <% end %>
<% end %>

如果您只计划在您的 Employee 模型中只拥有 managerstaff 角色,那么您可以使用三元运算符简化上述操作,例如 R_O_R的回答。

您可能希望从视图模板中抽象出条件逻辑。您可以通过创建辅助方法来完成此操作,如 Surya 的回答所示。

希望对您有所帮助!

是,使用三元运算符:

<%= render f.object.manager? ? 'manager_fields' : 'staff_fields' , :f => f %>

如果你能改变你的设计,我有更好的解决方案给你。如下:

使用 Rails enum 功能。

使用迁移在 Employee 模型中添加字段 desgination 作为整数字段。

然后在模型内部:

enum designation: [ :staff, :manager ]

然后您将在 designation 列中存储 say,或者 manager(值为 1)或 staff(值为 0)。现在在视图中调用 <%= render f.object.desgination , :f => f %> 。你应该有 _manager.html.erb_staff.html.erb 2 个部分。

大功告成!

是的,但这可能看起来有点难看:

<%= f.simple_fields for :employees do |f| %>
  <%= render (f.object.manager? ? 'manager_fields' : 'staff_fields'), :f => f %>
<% end %>

我可能会创建一个辅助方法,例如在 ApplicationHelperEmployeesHelper 文件中:

def get_employee_partial(employee)
  employee.manager? ? 'manager_fields' : 'staff_fields'
end

然后在表格中:

<%= render get_employee_partial(f.object), :f => f %>
<%= f.simple_fields for :employees do |e| %>
  <% partial_name = e.object.manager? ? 'manager' : 'staff' %>
  <%= render "#{partial_name}_fields" %>
<% end %>