我有一个相对简单的地址局部用于“新”和“编辑”表单,用于在对象上需要地址时。它很棒。现在的问题是我想在我的“节目”视图中显示相同的字段。唯一的问题是我的地址部分需要一个在“show”视图中不存在的表单。我会复制它,但是对于new / edit和另一个show来说,这似乎并不是很干。
我想知道是否有人解决了这个问题。我考虑过使用.new?和.persisted?但这并没有多大帮助,因为编辑对象将以与show对象相同的方式传递这两个对象。
非常感谢任何帮助。
编辑:这是我的地址部分新增和编辑。我想在新的,编辑和显示视图中使用相同的部分,因为重新创建一个全新的部分似乎不是很干。我看到的问题是,这个部分需要一个表单:f,当然在“show”视图中不可用。
<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>
答案 0 :(得分:1)
<%= fields_for @object do |f| %>
<%= render 'your/fields_parial', :f => f %>
<% end %>
答案 1 :(得分:1)
我有同样的担忧,想要干掉不仅仅是新的/编辑,还要表现出来。由于模型上有很多属性,因此在多个视图中并行维护它们会很麻烦。
除了这个(未解决的)帖子外,找不到任何东西。而@Valery,不是fields_for真的意味着编辑form_for中的其他模型吗?
@FlexFiend,我最终以这种方式解决了你的问题(不可否认,这很笨重,但它完成了工作):还要使用一个表单也用于show视图,并创建一个部分(由所有动作共享)调用测试控制器操作的助手,如果是“可编辑”,则调用正确的控件类型。否则只是渲染属性,如果它是一个show动作。
例如,起始模板(show,new,edit)只调用一个表格partial:
<%= render :partial => 'form' %>
...其中_form是通用的:
<%= form_for(@myObject) do |f| %>
<div>
<%= render :partial => "fields_for_all_actions", :locals => { :f => f } %>
</div
<% end %>
...在局部内部,要么显示或编辑'name'属性,请使用帮助'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中,可以由多个模型使用。
它有效,但我很想知道这个问题的其他解决方案,因为大型模型的维护挑战并非微不足道。当然,这可能是为了将模型重构为组件模型,但这是另一个帖子。
答案 2 :(得分:1)
在您的字段中加入readonly
属性,例如:
<%= f.text_field :name, readonly: @readonly %>
然后将@readonly = true
放在show
方法中。