Rails 嵌套形式 -> 根据值进行不同处理
Rails nested forms -> different treatment depending on value
我有一个关于嵌套表单的棘手问题。就说我有以下型号:
- 餐厅
- 员工,其中员工belongs_to家餐厅。
我在员工模型中也有两种类型的员工,
- 经理
- 员工
managers
在employees
模型中通过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 模型中只拥有 manager
和 staff
角色,那么您可以使用三元运算符简化上述操作,例如 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 %>
我可能会创建一个辅助方法,例如在 ApplicationHelper
或 EmployeesHelper
文件中:
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 %>
我有一个关于嵌套表单的棘手问题。就说我有以下型号:
- 餐厅
- 员工,其中员工belongs_to家餐厅。
我在员工模型中也有两种类型的员工,
- 经理
- 员工
managers
在employees
模型中通过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 模型中只拥有 manager
和 staff
角色,那么您可以使用三元运算符简化上述操作,例如 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 %>
我可能会创建一个辅助方法,例如在 ApplicationHelper
或 EmployeesHelper
文件中:
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 %>