I made helper for Bootstrap Form. In it I made a separate method
has_error?, who must determine whether the error messages, but this is
not
happening. How can I fix it? If there are still errors, omissions, and
not
the optimal code will once remarks and comments as to optimize (because
I
just learning ROR)
Here is the method itself has_error? (a piece of code from the file
app/helpers/bootstrap_control_helper.rb: 93)
… def has_error?(obj, method)
obj.respond_to?(:errors) && !(method.nil? ||
obj.errors[method].empty?) end …
Here is the full text of the file
app/helpers/bootstrap_control_helper.rb:
module BootstrapControlHelper
attr_reader :object, :template, :options
COMMON_OPTIONS = [:layout, :label_class, :label_col, :label_offset,
:label_text, :control_class, :control_col,
:control_offset, :invisible_label, :placeholder,
:popover, :error_disable, :row_disable, :required]
LABEL_OPTIONS = [:layout, :label_class, :label_col, :label_text,
:label_offset, :invisible_label]
CONTROL_OPTIONS = [:layout, :control_class, :control_col,
:control_offset]
FIELD_HELPERS = %w{color_field date_field datetime_field
datetime_local_field
email_field month_field number_field password_field phone_field
range_field search_field telephone_field text_area text_field
time_field
url_field week_field}
DATE_SELECT_HELPERS = %w{date_select time_select datetime_select}
def self.create_tagged_field(method_name)
define_method(method_name) do |obj, method, options = {}|
generate_form_group(obj, method, options) do
super(obj, method, options.except(*COMMON_OPTIONS))
end
end
end
FIELD_HELPERS.each do |method_name|
create_tagged_field(method_name)
end
def generate_form_group_row(options = {})
options[:control_col] ? content_tag(:div, “”, class: “row”) { yield
} : yield
end
def generate_form_group(obj, method, options = {}, &block)
generate_form_group_row(options.slice(:control_ col)) do
if options[:control_col] && options[:layout].nil?
options[:class] = [options[:class],
grid_system_class(options[:control_col])].compact.join(" “)
end
options[:class] = [options[:class], “form-group”].compact.join(”
“)
options[:class] = [options[:class], “has-error”].compact.join(” ")
if has_error?(obj, method)
content_tag(:div, class: options[:class]) do
generate_label(obj,
method,
options.
slice(*LABEL_OPTIONS)).concat(generate_control(options, &block))
end
end
end
def generate_label(obj, method, options={})
options[:class] = label_class(options)
label(obj, method, options[:label_text], options.slice(:class))
end
def label_class(options={})
options[:label_class] = [options[:label_class],
“sr-only”].compact.join(" “) if options[:invisible_label]
options[:label_class] = [options[:label_class],
“control-label”].compact.join(” “) if options[:layout] == :horizontal
[label_col_class(options), options[:label_class]].compact.join(” ")
end
def label_col_class(options={})
unless options[:label_col]
if options[:layout] == :horizontal
grid_system_class(defau lt_horizontal_label_col)
elsif options[:layout] == :inline
“sr-only”
end
else
options[:label_col]
end
end
def generate_control(options={}, &block)
options[:class] = control_class(options)
if options[:layout] == :horizontal
content_tag(:div, class: control_col_class(options)) { yield }
else
yield
end
end
def control_class(options={})
[“form-control”, options[:control_class]].compact.join(" ")
end
def control_col_class(options={})
unless options[:control_col]
grid_system_class(default_horizonta l_control_col) if
options[:layout] == :horizontal
else
grid_system_class(options[:control_ col])
end
end
def has_error?(obj, method)
obj.respond_to?(:errors) && !(method.nil? ||
obj.errors[method].empty?)
end
def grid_system_class(col=default_control_col)
“col-#{default_grid_system}-#{col}” if (1…12).include?(col)
end
def grid_system_offset_class(col=default_offset_control_col)
“col-#{default_grid_system}-offset-#{col}” if (1…12).include?(col)
end
def default_offset_control_col
3
end
def default_horizontal_label_col
3
end
def default_control_col
12
end
def default_horizontal_control_col
7
end
def default_date_col
4
end
def default_grid_system
“sm”
end
def error_class
“has-error”
end end
Here is the full text of the file app/helpers/bootstrap_form_helper.rb:
module BootstrapFormHelper
def bootstrap_form_for(object, options={}, &block)
layout = case options[:layout]
when :inline
"form-inline"
when :horizontal
"form-horizontal"
end
if layout
options[:html] ||= {}
options[:html][:class] = [options[:html][:class],
layout].compact.join(" ")
end
form_for(object, options, &block)
end end
Here is the full text of the file
app/helpers/bootstrap_builder_helper.rb:
module BootstrapBuilderHelper
class BootstrapBuilderHelper < ActionView::Helpers::FormBuilder #
NestedForm::Builder
include BootstrapControlHelper
include BootstrapFormHelper
end end
And the form in which I test app / views / sessions / new.html.erb:
… <%= bootstrap_form_for(:session, url: sessions_path, html: { role:
“form” }) do |session_fields| %>
<%= session_fields.text_field(:email, control_col: 8) %>
<%= session_fields.password_field(:password, control_col: 8) %> <%
end %> …