2010-12-15 56 views
0

我在表单中使用自定义select_with_new_option方法是这样的:Rails:如何用“div”标签包装生成的“select”?

<%= select_with_new_option(f, :shop, :name, :id) %> 

下面是它的定义:

def select_options_with_create_new(objects, text_field, value_field, options={}) 
    object = objects.to_s.singularize 
    all_objects = object.capitalize.constantize.all 
    all_objects = all_objects.sort_by(&options[:order_by]) if options.has_key?(:order_by) 
    select_options = all_objects.map{ |obj| [obj.send(text_field), obj.send(value_field)] } 
    select_options << [wrap_create_new_option("create new #{object}".titleize), "new_#{object}"] 
end 

def wrap_create_new_option(str) 
    ">> #{str} <<" 
end 

# By default, sorts by 'text_field'. 
def select_with_new_option(f, object, text_field, value_field) 
    f.select(:"#{object}_id", select_options_with_create_new(object.pluralize, text_field, value_field, :order_by => text_field), 
      {:prompt => true}, # options 
      {})     # html_options 
end 

这就造成了select标签和它的option S作为预期。

现在,我想用一个div这样来包装这个select

<div class='my_class'> 
    <select>...</select> 
</div> 

什么将是“Rails的方式”做最简单的方法?

回答

1

使用content_tag方法:

def select_with_new_option(f, object, text_field, value_field) 
    html = f.select(:"#{object}_id", 
      select_options_with_create_new(object.pluralize, text_field, value_field, :order_by => text_field), 
      {:prompt => true}, # options 
      {})     # html_options 
    content_tag :div, html, :class => "my_class" 
end 
3

如果你不想修改你的方法,你可以将它传递给content_tag方法块:

<%= content_tag :div, :class => "my_class" do %> 
    <%= select_with_new_option(:f, :shop, :name, :id) %> 
<% end %>