Rails: использование полей формы, которые не привязаны к модели при проверке
В приложении Ruby on Rails я пытаюсь использовать информацию из полей, которые не связаны с моделью в валидации.
Вот часть модели в качестве примера (вся модель получила большой интерес):
class Scorecard < ActiveRecord::Base
belongs_to :course
belongs_to :user
validate :attributes_consistency
def attributes_consistency
# Executed for all scorecards. Checks if the user completed the hole attributes correctly
if ( params[:no_fairways] and any_fairways? and !only_nine? ) or ( params[:no_fairways] and !any_h1_to_h9_score_blank and any_h1_to_h9_fairway? and only_nine? ) or ( params[:no_fairways] and !any_h10_to_h18_score_blank and any_h10_to_h18_fairway? and only_nine? )
errors.add_to_base("You inidicated that you missed all the fairways, but you also marked one or more fairways in the scorecard. Either uncheck the fairways mistakenly marked or uncheck the 'No fairways' checkbox.")
end
if ( params[:no_girs] and any_girs? and !only_nine? ) or ( params[:no_girs] and !any_h1_to_h9_score_blank and any_h1_to_h9_gir? and only_nine? ) or ( params[:no_girs] and !any_h10_to_h18_score_blank and any_h10_to_h18_gir? and only_nine? )
errors.add_to_base("You inidicated that you missed all the greens, but you also marked one or more greens in the scorecard. Either uncheck the marked greens on the scorecard or uncheck the 'No GIRs' checkbox.")
end
end # attributes_consistency
def any_h1_to_h9_score_blank?
h1_score.blank? or h2_score.blank? or h3_score.blank? or h4_score.blank? or h5_score.blank? or h6_score.blank? or h7_score.blank? or h8_score.blank? or h9_score.blank?
end
def any_h10_to_h18_score_blank?
h10_score.blank? or h11_score.blank? or h12_score.blank? or h13_score.blank? or h14_score.blank? or h15_score.blank? or h16_score.blank? or h17_score.blank? or h18_score.blank?
end
def any_h1_to_h9_fairway?
h1_fairway? or h2_fairway? or h3_fairway? or h4_fairway? or h5_fairway? or h6_fairway? or h7_fairway? or h8_fairway? or h9_fairway?
end
def any_h10_to_h18_fairway?
h10_fairway? or h11_fairway? or h12_fairway? or h13_fairway? or h14_fairway? or h15_fairway? or h16_fairway? or h17_fairway? or h18_fairway?
end
def any_h1_to_h9_gir?
h1_gir? or h2_gir? or h3_gir? or h4_gir? or h5_gir? or h6_gir? or h7_gir? or h8_gir? or h9_gir?
end
def any_h10_to_h18_gir?
h10_gir? or h11_gir? or h12_gir? or h13_gir? or h14_gir? or h15_gir? or h16_gir? or h17_gir? or h18_gir?
end
Итак, как я могу получить доступ к params
из модели?
Ответы
Ответ 1
Не позволяйте параметрам подкрадываться к модели. Там нет смысла иметь контроллер в этом случае. Вместо этого просмотрите этот эпизод из Railscasts, который рассказывает о виртуальных атрибутах, которые не входят в базу данных, но все еще могут использоваться для валидации.
Вам не нужен соответствующий атрибут модели для виртуальных атрибутов. Определите атрибуты, локальные для класса, такие как @no_fairways
, которые удерживают состояние.
class ScoreCard < ActiveRecord::Base
# define attributes and accessors for both fields
attr_accessor :no_fairways, :no_girs
..
end
Теперь внутри формы вы можете просто написать:
<% form_for @scorecard %>
<%= f.check_box :no_fairways %>
<% end %>
Ответ 2
Найденное решение, спасибо за жаргон, однако, "виртуальный атрибут" помог с поиском google.
Самый чистый способ добиться этого - создать атрибуты, которые не являются частью базы данных, но все еще являются частью модели. В моем случае я помещал это в модель:
attr_accessor :no_fairways
attr_accessor :no_girs
Это просто! Теперь @scorecard.no_fairways
и @scorecard.no_girs
действуют так же, как и любой другой атрибут, но не являются частью базы данных.