3

我有一个相对简单的地址部分,用于“新”和“编辑”表单,以便在对象上需要地址时使用。它工作得很好。现在的问题是我希望相同的字段显示在我的“显示”视图中。唯一的问题是我的地址部分需要一个“显示”视图中不存在的表单。我会复制它,但是将一个部分用于新/编辑和另一个用于显示似乎不是很干燥。

我想知道是否有人解决了这个问题。我考虑过使用 .new 吗?和.persisted?但这并没有真正的帮助,因为用于编辑的对象会以与显示对象相同的方式传递这两个对象。

任何帮助是极大的赞赏。

编辑:这是我的新地址和编辑地址。我想在新的、编辑和显示视图中使用相同的部分,因为重新创建一个全新的部分似乎不是很干。我看到的问题是这个部分需要一个表单:f,这当然在“显示”视图中不可用。

<p>
  <%= f.label :address_line_1, 'Address 1' %><br />
  <%= f.text_field :address_line_1 %>
</p>

<p>
  <%= f.label :address_line_2, 'Address 2' %><br />
  <%= f.text_field :address_line_2 %>
</p>

<p>
  <%= f.label :city %><br />
  <%= f.text_field :city %>
</p>
<p class="address_state">
  <%= f.label :state , "State" %><br />
  <%= f.select :state, us_states, :include_blank => true  %>
</p>

<p>
<%= f.label :zip_code, 'Zip Code' %><br />
  <%= f.text_field :zip_code %>
</p>
4

3 回答 3

2

我也有同样的担忧,不仅想干掉新的/编辑,还想干掉节目。模型上有很多属性,在多个视图中并行维护它们变得很痛苦。

翻来覆去,找不到任何东西,除了这个(未解决的)帖子。还有@Valery,fields_for 不是真的用于编辑form_for 中的其他模型吗?

@FlexFiend,我最终以这种方式解决了你的问题(诚然,它很笨拙,但它完成了工作):也为显示视图使用表单,并创建一个调用助手的部分(由所有操作共享)测试控制器动作,如果“可编辑”,则调用正确的控件类型。否则,如果它是一个显示动作,则只呈现该属性。

例如,起始模板(show、new、edit)简单地调用一个表单部分:

<%= render :partial => 'form'  %>

...其中 _form 是通用的:

<%= form_for(@myObject) do |f| %>
  <div>
    <%= render :partial => "fields_for_all_actions", :locals => { :f => f  } %>
  </div
<% end %>

...在部分内部,要显示或编辑“名称”属性,请使用帮助程序“render_field”:

<div><%= f.label :name %><span><%= render_field("@facility",f,"name", 30)%></span></div>

在助手内部,render_field 看起来像这样:

def render_field(object_name, f, attribute, txt_size=20)
  if %w[new edit create update].include? controller.action_name
    f.text_field(attribute.to_sym, :size => txt_size)
  else
    eval(object_name + "." + attribute)
  end
end

我为其他控件(文本区域、收音机、复选框等)创建了其他助手。这些助手不是特定于模型的,它们存在于 application_helper.rb 中并且可以被多个模型使用。

它有效,但我很想知道这个问题的其他解决方案,因为大型模型的维护挑战并非微不足道。当然,这可能是为了将模型重构为组件模型,但那是另一篇文章。

于 2013-06-11T23:22:06.907 回答
2

readonly在您的字段中包含一个属性,例如:

<%= f.text_field :name, readonly: @readonly %>

然后放入@readonly = true您的show方法中。

于 2013-10-05T10:54:00.897 回答
1
 <%= fields_for @object do |f| %>
   <%= render 'your/fields_parial', :f => f %>
 <% end %>
于 2013-01-11T08:32:22.350 回答