Rails:使用partials进行输入是否正确?

时间:2014-05-22 15:53:31

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

我正在构建一个Rails应用程序。我已经完成了所有逻辑(数据库,控制器,模型等)。现在是时候做好了。

为了集中应用程序的视图,我正在考虑为常见的东西创建部分内容。例如,一个名为common / _text_input.html.erb的部分将包含

<div class="field">
    <%= f.label id %><br />
    <%= f.text_field id %>
</div>

这将使用

从表单内部调用
<%= render partial: "common/text_input", locals: { f: f, id: :name } %>
  1. 这种做法是否正确?在rails中还有其他选项吗?

  2. 如果这是执行此操作的正确方法,我该如何为表单标记(例如内容插入其中)进行此操作?

  3. 由于

1 个答案:

答案 0 :(得分:0)

1 - 还有另一个选项,Helpers和content_tag

def text_input(form_builder, attribute, options = {})
  options = { div: { class: :field }, label: { class: attribute } }.merge(options) # default options

  content_tag :div, options[:div] do
    f.label(attribute, options[:label]) + content_tag(:br) + f.text_field(attribute, options[:input])
  end
end

用法:

= form_for @resource do |f|
  = text_input(f, :first_name)
  = text_input(f, :last_name, input: { style: 'color: red;' }, label: { class: :another_class })

2 - 使用partials是正确的,但它不像Helpers那样灵活(参见options hash和在特定情况下使用其他方法的可能性)。要处理form_tag(即无form_builder),您可以实施一种新方法:

# usage
= form_tag root_path, method: :get do
  = text_input(nil, :search, input: { value: params[:search] }, label: { content: "Search for something!" })

# helper methods
def text_input(form_builder, attribute, options = {})
  options = { div: { class: :field }, label: { class: attribute } }.merge(options) # default options
  return text_input_tag(attribute, options) if form_builder.blank?

  content_tag :div, options[:div] do
    f.label(attribute, options[:label]) + content_tag(:br) + f.text_field(attribute, options[:input])
  end
end

def text_input_tag(attribute, options = {})
  value = options[:input].try(:delete, :value)
  label_content = options[:label].try(:delete, :content)

  content_tag :div, options[:div] do
    label_tag(attribute, label_content, options[:label]) + content_tag(:br) + text_field_tag(attribute, value, options[:input])
  end
end