erb中的预处理条件

时间:2014-05-15 09:26:59

标签: ruby-on-rails ruby preprocessor erb

我想尽可能地干掉代码,但我觉得这可能太干了......

我有一个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喜欢

这显然是一场大规模的失败......

我该如何编写这种代码?

2 个答案:

答案 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