Problem z pobieraniem do formularza danych po wysłaniu post

Witam,

Próbuję utworzyć formularz który po nie udanym zapisaniu, wyświetli błędy oraz w polach input przywróci poprzednio wpisane wartości które podałem przed próbą zapisu.

Niestety w żaden sposób nie mogę tego osiągnąć. Za każdym razem mam puste pola w formularzu.

Oto mój kod:

# controller class UsersController < ApplicationController def register if request.post? @user = User.new(params[:user]) if @user.save redirect_to :login, :notice => "Twoje konto zostalo zalozone. Teraz mozesz sie zalogowac." end else @user = User.new end end end

[code=ruby]#view
<% if @user.errors.any? %>

<%= pluralize(@user.errors.count, "error") %> prohibited this test from being saved:

<ul>
<% @user.errors.each do |name, msg| %>
  <li><%= msg %></li>
<% end %>
</ul>
<% end %> <%= form_for(:user, @user, :url => '/users/register', :html => {:id => 'form', :multipart => true, :class => 'formLogin'}) do |f| %>
<%= f.label :username, "Login:" %> <%= f.text_field :username, :value => @user.username %>
<%= f.label :password, "Hasło:" %> <%= f.password_field :password %>
<%= f.label :password_confirmation, "Powtórz hasło:" %> <%= f.password_field :password_confirmation %>
<%= f.submit "Zarejestruj się" %>
<% end %>[/code] Dodam że nie chce w tej chwili korzystać z RESTa.

Chciałbym jakoś uzyskać efekt w wyżej podanym kodzie. Co Waszym zdaniem robię nie tak? :frowning:

Dodam że mimo wypełnienia formularza, po jego wysłaniu dostaje komunikaty o tym że żadne pole nie zostało wypełnione. Czyli tak jakby do User.new w ogóle nie docierała tablica params[:user]

Już pominę dociekanie czemu chcesz ominąć REST i uzyskać coś co jest defaultowe dla akcji new i edit ale ok

twój kod:

if request.post? @user = User.new(params[:user]) if @user.save redirect_to :login, :notice => "Twoje konto zostalo zalozone. Teraz mozesz sie zalogowac." end else @user = User.new end
Powinno być:

if @user.save flash[] = ... redirect_to .... else #tego ci brakuje render ... #gdzieś musisz przekierować gdzie masz formularz zapewne # render :action => 'new' end
Obejrzyj sobie jakiś restowy controller wygenerowany przez scaffold, i masz rozwiązanie

Co do widoku bo się nie przyjrzałem wcześniej po co ci multipart jak masz zwykłe pole stringowe a nie ma plików?

Do tego co masz w modelu? Jak chcesz błędy (validację) to musisz ją w modelu zrobić. No i chyba osttanie czemu nasz value na sztywno wpisane w formularzu dla usera. Jak chcesz coś przekazać przez formularz to nie zwykłym polem a ukrytym z wartością. Tak jak masz jest źle i nie będzie działać, bo pewnie ci chodziło że ma tam się pojawić no nieudanym zapisie co i jak. Nie tędy droga.

Wszystko dzieje się w ramach jednej akcji ‘register’. Nie chce użyć RESTa gdyż wiązało by się to ze znacznymi zmianami na które nie mam już czasu :frowning: Więc muszę wykorzystać to co jest.

Ok na szybko zmieniłem na RESTa ale dalej wartości nie są uzupełniane w polach formularza :frowning:

[code=ruby]# controller
class UsersController < ApplicationController
def new
@user = User.new
end

def create
@user = User.new(params[:user])

if @user.save
    flash[:message] = "Twoje konto zostalo zalozone. Teraz mozesz sie zalogowac."
    redirect_to @user
else
  render :action => "new"
end

end
end[/code]

[code=ruby]# widok
<% if @user.errors.any? %>

<%= pluralize(@user.errors.count, "error") %> prohibited this test from being saved:

    <% @user.errors.each do |name, msg| %>
  • <%= msg %>
  • <% end %>
<% end %>

<%= form_for(@user, :html => {:id => ‘form’, :class => ‘formLogin’}) do |f| %>


<%= f.label :username, “Login:” %>
<%= f.text_field :username, :value => @user.username %>


<%= f.label :password, “Hasło:” %>
<%= f.password_field :password %>


<%= f.label :password_confirmation, “Powtórz hasło:” %>
<%= f.password_field :password_confirmation %>


<%= f.submit “Zarejestruj się” %>
[/code]

[code=ruby]#model
require ‘digest/md5’

class User < ActiveRecord::Base
attr_accessor :password, :password_confirmation, :sessionid
attr_accessible :sessionid

validates_presence_of :username, :message => “Nazwa uzytkownika jest wymagane”
validates_uniqueness_of :username, :message => “Podana nazwa uzytkownika jest juz zajeta”
validates_presence_of :password, :message => “Haslo jest wymagane”
validates_presence_of :password_confirmation, :message => “Musisz powtorzyc haslo”
validate :passsword_compared?

def passsword_compared?
return if self.password == self.password_confirmation
self.errors.add(:password_confirmation, “Powtorzone haslo nie jest takie same”)
end

def password=(value)
@password = value
self.hashed_password = User.encrypt(@password)
end

def self.encrypt(pass)
Digest::MD5.hexdigest(pass)
end

def self.authenticate(username, password)
user = self.find_by_username(username)
return nil if user.nil?
return user if User.encrypt(password) == user.hashed_password
nil
end
end[/code]

wywal to value z formularza w username, wtedy username powinien sie pojawic, ale haslo nigdy nie jest zapamietywane, zawsze to pola od hasla beda puste. Przynajmniej z tego co kojarze

jak musisz to zostaw to w jednej akcji :confused: ale dodaj ten else render … do tego

Nic z tego :confused:
Zastanawiam się czy to normalne że po wyświetleniu zmiennej @user, jest ona pusta.

@user = User.new(params[:user]) # params[:user] zwraca tablice z zmiennymi z formularza render :inline => @user.to_s # widzę na ekranie tylko '#'
Generalnie co nie wpiszę do formularza, to dostaje komunikat że pola są wymagane. Tak jakby dane dodane do formularza nie były widoczne :confused:

nie to_s a inspect jak już coś i ten # nie inforuje że nic w niej nie ma, zonasz @user.costam