【问题标题】:Pass instance or local variable from layout to view in Rails将实例或局部变量从布局传递到 Rails 中的视图
【发布时间】:2010-10-13 23:35:10
【问题描述】:

我正在尝试使用form_for 设置一个相当复杂的表单。此表单需要在多个视图中,其中某些字段可用于所有操作,而其他字段特定于每个单独的操作。

我想为了节省自己的代码重复,我会使用布局来渲染通用部分,如下所示:

# layout.html.erb
<%= form_for @instance do |f| %>
  <%= f.text_field :foo %><!-- This field needs to be available in all views -->
  <...><!-- Additional non-form related html -->
  <%= yield %>
  <%= f.submit %>
<% end %>

# first_view.html.erb
<% f.fields_for :bar do |b| %>
  <%# Fields %><!-- These fields should only be available in first_view -->
<% end %>

# second_view.html.erb
<% f.text_field :baz %><!-- This field should only be available in second_view -->

现在,问题是我不能将f 作为局部变量从布局传递到视图。我什至无法设置实例变量(例如@f = f)并在视图中访问它。

我怎么能这样做?欢迎任何关于更好实施的建议。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activeview


    【解决方案1】:

    您能否将表单提取到部分中,该部分将 ':bar' 或 ':baz' 字段作为本地字段,由渲染该部分的视图传递?

    render :partial => 'complex_form' :locals => { :text_field_param => :bar }
    

    上面的行将在 first_view 中调用,部分将包含所有表单逻辑和标记,使用专门的文本字段的“text_field_param”。

    【讨论】:

    • 不怕。该表格比我上面的简化示例复杂得多; first_view 可能有复选框,而 second_view 可能有文本字段。我会相应地更新我的示例。
    【解决方案2】:

    最后,我决定采用简单、万无一失的解决方案。我现在将form_for 移到了各个视图中,并将常规字段放在了部分视图中。这意味着我必须复制form_for 以及部分渲染,但我可以忍受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多