Dodanie kilku pól w bazie dla istniejacych już userów

Chcę zrobić takie coś. Mam już kilku istniejących w bazie studentów. Każdy z nich ma przypisaną pracę jaką pisze (Inżynierska lub Magisterska). Chcę mieć możliwość, aby promotor mógł dodawać daty obron, daty złożenia pracy w zależności od tego jaką pracę pisze student. Czyli dla inżynierów będą inne daty niż dla magistrów. Mogło by to wyglądać tak: Mam text_field, tam wpisuje datę, po naciśnięciu przycisku wstawia tą datę do bazy dla określonych studentów. Chodzi mi konkretnie o to jak przekazać tą datę do kontrolera i jak wybrać tych określonych studentów.
Mam nadzieje, że zrozumiałe jest to co tu nabazgrałem :slight_smile:

Pierw robisz migracje i w niej dodajesz okreslone, nowe pola. Jak? bylo z 1000 razy google tez wiem i kazda pomoc

pozniej np

[code=ruby]date = Date.today <- u ciebie bedzie params[:formularz][:pole_z_data] np

def add_date(date, rodzaj)
studets = Student.all(:conditions => [‘rodzaj’,rodzaj]) <- wybierz z bazy wszytskiech studentow dla rodzaju magisterka np
students.each do |s|
s.pole_z_bazy = date
s.save
end
end[/code]
Cos takiego np. No musisz to dostosować do realiów własnych

Próbuje zrobić jak napisałeś, ale coś nie wychodzi. Wyskakuje błąd ArgumentError in UsersController#date “wrong number of arguments (0 for 2)”. Dodam, że formularz wygląda tak:

<% form_for :user, :url => {:action => "update_date"} do |f| %> </br><p><label for="date">Data</label><br/> <%= f.text_field :give_back_work %> <input id="inputsubmit5" type="submit" name="inputsubmit5" value="Dodaj" /> <% end %>
:give_back_work to jest pole daty

no jak byk pisze ze metoda jaka chcesz wyolac potrzebuje 2 parametrow, a ty dostarczasz jej cale 0.

wklej to co masz kontrolerze w metodzie: update_date

“give_back_work” to chyba lepiej nazwać deadline :slight_smile:

Ale co do meritum - jeśli dodałeś w kontrolerze akcję “update_date”, to ona nie może przyjmować żadnych argumentów - kod zaproponowany prze gotara musisz zmienić tak, by pobierał te argumenty z hasha “params”, np.

def update_date date = params[:user][:give_back_work] type = params[:type] # o ile dodasz takie pole students = Student.find(...) # lub lepiej zrobić named_scope, albo po bożemu dodać dwie klasy odpowiadające magistrom i inżynierom studnets.each ... end

Widok mam jak napisalem wczesniej, a w kontrolerze tak:

def update_date @type = "Inżynierska" data = params[:user][:give_back_work] students = User.find(:all, :conditions => ["type_of_work = ?", @type]) students.each do |s| s.give_back_work = data s.save end end
No i nie zapisuje mi do bazy. Ciezko powiedziec w czym tkwi problem. Napewno nie w “conditions” bo probowalem dla wszystkich zapisac to tez nie zapisuje…

A wywołujesz w ogóle tę metodę update_date ? Najlepiej napisz sobie test i zobacz gdzie się wywala. Wklej nam wtedy tutaj jaki jest błąd jak dalej nie będziesz wiedział co i jak.

Wywołuje sie, w formularzu masz “:action => “update_date””. Sprawdziłem, poprawnie sie wywyłuje

tak tylko sie spytam czy masz te pole give_back_work w tabeli User?

Reszta wyglada ok raczej powinno działać

No a tak w ogole moze jaks if dasz wtedy bedziesz widzial czy save sie robi

def update_date @type = "Inżynierska" ok = 0 data = params[:user][:give_back_work] students = User.find(:all, :conditions => ["type_of_work = ?", @type]) students.each do |s| s.give_back_work = data if s.save ok += 1 end end redirect_to "/" flash[:notice] = "Udało się zapisać #{ok} razy" end
:wink:

Tak. Mam takie pole:) Mam wrażenie że give_back_work nie trzyma tego co wpisalem w text_field. Jak chce wypisac w taki sposob “puts give_back_work” to mi mowi ze nie ma takiej metody jak “give_back_work”.

ps

a w modelu w attr_accesible dałeś o pole jako pole które jest używane w formularzu?!?! inaczej je pominie!

Tam jest ok. Wywalilem stamtad attr_accesible. Wiec wszystko powinno zapisywac jak z reszta do tej pory zapisywalo

No to konsola

u = User.new
u.give_back_work = Date.today
u.save

User.last

i patrzysz czy cos z palca zapisalo

No nie wiem czemu to nie działa. Jak ktoś wpadnie na pomysł niech pisze

Spróbuj w konsoli u.save! to powinno coś wyświetlić

Nie korzystałem nigdy z konsoli… i cos nie wychodzi mi to. Używam aptana pod windows

no to czas zacząć. Bez konsoli naprawdę będzie ci ciężko.

Chyba nie

puts give_back_work

tylko

puts params[:user][:give_back_work]

a lepiej

logger.debug params[:user][:give_back_work]

Możesz też zobaczyć przy pomocy firebug czy czegoś innego jakie parametry poszły
a “coś innego” to np.

<%= debug(params) %>

pozdrawiam

:give_back_work trzyma to co trzeba. Testowałem i wnioskuję iż chodzi o zapisywanie do bazy. Nie wiadomo dlaczego s.save po prostu nie zapisuje…

spróbuj save! może pokaże Ci jakieś dodatkowe błędy