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
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
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
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