我想尽可能地干掉代码,但我觉得这可能太干了......
我有一个fields_for
部分,有时我需要通过关系来获取它,有时我需要fields_for
来获取对象本身
<%= form_for model_name do |f| %>
<%= render partial: 'fields_for_partial', locals: {f: f, ... } %>
<% end %>
调用fields_for partial会有所不同,具体取决于我何时需要表单 - 如果我想创建一个新模型,我会使用form_for
的{{1}},但有时我想编辑模型,只显示一个特定的嵌套模型,然后我将使用f
来呈现该特定对象的字段
我在测试我传递的局部变量fields_for nil, obj
时尝试这样做
f
部分的其余部分将是常规<% if f.nil? %>
<%= fields_for object_name, obj do |ff| %>
<% else %>
<%= f.fields_for object_name, obj do |ff| %>
<% end %>
,fields_for
喜欢
这显然是一场大规模的失败......
我该如何编写这种代码?
答案 0 :(得分:1)
您可以使用local_assigns:
<% form_or_view = local_assigns[:f] || self %>
<%= form_or_view.fields_for object_name, obj do |ff| %>
答案 1 :(得分:0)
将呼叫移至共享部分之外的fields_for
。以项目和任务为例。您允许用户同时创建项目和任务。
# using HAML
# project form
= form_for @project do |f|
= f.fields_for :tasks do |tf|
= render 'tasks/form', f: tf
您还允许用户仅创建任务。
# task form
= form_for @task do |f|
= render 'tasks/form', f: f
tasks/_form.html.haml
部分看起来像
# task fields
= f.text_field :title
= f.text_area :description