Rails: использование полей формы, которые не связаны с моделью в валидациях - PullRequest
10 голосов
/ 25 июля 2010

В приложении 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 из модели?

Ответы [ 2 ]

15 голосов
/ 25 июля 2010

Не позволяйте парамам подкрадываться к модели.В этом случае нет смысла иметь контроллер.Вместо этого извлеките этот эпизод из 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 %>
3 голосов
/ 25 июля 2010

Нашел решение, спасибо за язык, хотя "виртуальный атрибут" помог с поиском Google.

Самый простой способ сделать это - создать атрибуты, которые не являются частью базы данных, но все еще являются частьюмодель.В моем случае я поместил это в модель:

attr_accessor :no_fairways
attr_accessor :no_girs

Это просто!Теперь @scorecard.no_fairways и @scorecard.no_girs действуют как любые другие атрибуты, но не являются частью базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...