2012-03-14 6 views
15

Dla mojej aplikacji mam różne punkty wejścia do rejestracji, które sprawdzają różne rzeczy.Szyny, jak ustawić zmienną tymczasową, która nie jest polem bazy danych

W głównej rejestracji nic nie jest wymagane, z wyjątkiem pola adresu e-mail i hasła. W alternatywnym polu rejestracji wymaganych jest znacznie więcej. Tak więc w modelu użytkownika mam Chcę ustawić tę flagę przez kontroler. Jednak ta flaga nie jest polem bazy danych. Zastanawiam się tylko, czy jest to możliwe w Railsach czy coś jest nie tak ze sposobem, w jaki o tym myślę? Jeśli tak, jaki jest najlepszy sposób, aby to osiągnąć? Dzięki.

+0

"zmienne instancji" (wyeksponowane przez akcesory - np. 'Attr' - w razie potrzeby). Debata jest dyskusyjna, jeśli jest to "dobra praktyka", aby zrobić to w modelu, właśnie dlatego, że nie są * częścią * modelu * utrwalonego *. Jednak w kontrolerze, dlaczego nie? –

+0

Potrzebuję go tylko jako zmiennej tymczasowej dla tego zapisu wywołanego ze sterownika. Kiedy ustawiam @ user.flag = true w kontrolerze, nie widzę go jednak w modelu. – gtr32x

+0

Więc muszę zdefiniować attr_accessor do niego? Co jeśli mam już attr_protected, czy tak jest w pobliżu? – gtr32x

Odpowiedz

28

Co trzeba to attr_accessor

class User < ActiveRecord::Base 
    attr_accessor :flag 
    attr_accessible :flag # if you have used attr_accessible or attr_protected else where and you are going to set this field during mass-assignment. If you are going to do user.flag = true in your controller's action, then no need this line 
end 

zasadzie attr_accessor :flag stworzyć user.flag i user.flag = ... metody modelu.

i attr_accessible służy do ochrony przed masowymi zadaniami.

+0

Cool, attr_accessor, ale działa! Dzięki! – gtr32x

+0

Doh! nie dla Railsów 4 http://easyactiverecord.com/blog/2014/04/01/rails4-strong-parameters-and-the-attr-accessible-macro/ – olyv

+0

Uważam, że najłatwiej jest użyć zmiennej klasowej @flag dla ta kwestia .. – JChow

1

Wydaje się, że trzeba zdefiniować metody setter

class User < ActiveRecord::Base 
    attr_accessible :flag 

    def flag=(boolean) 
    boolean 
    end 
end 
+0

Próbowałem tego, wraz z attr_accessible też, ale nadal nie działa. – gtr32x

3

Nawiązując do debaty najlepszych praktyk:

Utwórz metodę, która robi to, co chcesz. To znaczy. save_with_additional_validation. Jest to o wiele bardziej przejrzysty i samokodujący się kod i działa w ten sam sposób. Po prostu wywołaj tę metodę zamiast save()

Powiązane problemy