for i in range(len(temp_list)):
list_to_assign[i][0] = temp_list[i]
Поскольку я не мог выяснить, почему теги select не были включены в этот Proc, я создал вспомогательный метод который делает почти то же самое.
def field_with_error(object, method, &block)
if block_given?
if error_message_on(object, method).empty?
concat capture(&block)
else
concat '<span class="fieldWithErrors">' + capture(&block) + '</span>'
end
end
end
Я использую это в своих взглядах следующим образом:
<% field_with_error @some_object, :assoc do %>
<%= f.select(:assoc_id, @associations.collect {|assoc| [ asoc.name, assoc.id ] }) %>
<% end %>
Если кто-нибудь знает лучший или более чистый способ сделать это, я открыт для предложений.
Я нашел этот пост в блоге, который, кажется, решает эту проблему:
Надеюсь, что это полезно!
Другой способ, можно вставить на уровне метода или контроллера, или в the environment.rb:
ActionView :: Base.field_error_proc = proc {| input, instance | input}
Проблема (по крайней мере для меня) заключалась в том, что мой f.select: any_id
искал в объекте object.errors
ключ : something_id
, когда моя проверка действительно была на : something
, а не : any_id
.
Я решил эту досадную проблему, изменив
object.errors.on(@method_name)
на
object.errors.on(@method_name) || object.errors.on(@method_name.gsub(/_id$/, ''))
] Вот отличия (от Rails 2.3.4):
diff --git a/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb b/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb
index 541899e..5d5b27e 100644
--- a/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb
+++ b/vendor/rails/actionpack/lib/action_view/helpers/active_record_helper.rb
@@ -247,7 +247,7 @@ module ActionView
alias_method :tag_without_error_wrapping, :tag
def tag(name, options)
if object.respond_to?(:errors) && object.errors.respond_to?(:on)
- error_wrapping(tag_without_error_wrapping(name, options), object.errors.on(@method_name))
+ error_wrapping(tag_without_error_wrapping(name, options), object.errors.on(@method_name) || object.errors.on(@method_name.gsub(/_id$/, '')))
else
tag_without_error_wrapping(name, options)
end
@@ -256,7 +256,7 @@ module ActionView
alias_method :content_tag_without_error_wrapping, :content_tag
def content_tag(name, value, options)
if object.respond_to?(:errors) && object.errors.respond_to?(:on)
- error_wrapping(content_tag_without_error_wrapping(name, value, options), object.errors.on(@method_name))
+ error_wrapping(content_tag_without_error_wrapping(name, value, options), object.errors.on(@method_name) || object.errors.on(@method_name.gsub(/_id$/, '')))
else
content_tag_without_error_wrapping(name, value, options)
end