我正在构建一个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 } %>
这种做法是否正确?在rails中还有其他选项吗?
如果这是执行此操作的正确方法,我该如何为表单标记(例如内容插入其中)进行此操作?
由于
答案 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