Nazwa akcji i kontrolera w modelu

Witam,

Pewnie głupie pytanie no ale nie mogę sobie z nim poradzić.
Można w modelu w jakiś sposób pobrać nazwę akcji oraz kontrolera?

Nie.

Jeżeli musisz się znać kontroler i akcję w modelu to prawdopodobnie robisz coś nie tak (od strony architektury aplikacji).

Może pokaż przykład? Będzie łatwiej to poprawić.

Nie można pobrać ale możesz dostarczyć modelowi wszystkie potrzebne informacje z kontrolera. Możesz przekazać jako parametr metody params[:action] i params[:controller] lub też instancję kontrolera. Czasem jest to przydatne. Np jak model musi wygenerować url to najłatiwje to zrobić właśnie przekazując mu kontroler do którego będzie delegować generowanie urli.

W modelu User mam taki walidator:

validates :password, :presence => true, :confirmation => true, :length => { :within => 6..40 }
Chciałem ograniczyć ten walidator tak, że podczas tworzenia nowego usera walidator jest włączony. W przypadku update’a są dwa przypadki: Jeżeli pole password jest puste to walidacja jest wyłączona, w przeciwnym wypadku walidator działa. I myślałem ze zrobię w ten sposób:

[code]validates :password, :presence => true,
:confirmation => true,
:length => { :within => 6…40 },
:unless => :validate_password?

def validate_password?
password.blank? && nazwa_akcji == ‘update’
end[/code]
Ale właśnie przed chwilą wpadłem na coś takiego:

def validate_password? password.blank? && !new_record? end
No i działa tak jak chce :slight_smile: Jest jakiś lepszy sposób czy ten jest ok?

validates :password, :presence => true, :confirmation => true, :length => { :within => 6..40 }, :on => :create
może tak?
http://edgeguides.rubyonrails.org/active_record_validations_callbacks.html#on

Rozwiązanie z :on => :create nie do końca rozwiązuje problem - bo jeżeli ktoś będzie chciał zmienić hasło w trakcie edycji to walidacja nie zadziała.

Twoje rozwiązanie tomash wydaje się sensowne…

  1. w przypadku update pole password chyba nie jest puste, prawda? (tzn. user.password zwroci Ci jakiegos stringa, ktory przejdzie walidacje) - przynajmniej w znanych mi bibliotekach do uwierzytelniania :wink:
  2. to, co chciałeś osiągnąć wcześniej, da się zrobić przez :if => :password_changed?