Ruby on Rails - 编辑/新建并显示相同的部分

时间:2013-01-11 02:41:58

标签: ruby-on-rails model partial-views dry

我有一个相对简单的地址局部用于“新”和“编辑”表单,用于在对象上需要地址时。它很棒。现在的问题是我想在我的“节目”视图中显示相同的字段。唯一的问题是我的地址部分需要一个在“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>

3 个答案:

答案 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方法中。