Wyświetlanie błędów w form

Witam.
Mam pewien problem otóż chciałem wyświetlać errors w moim pliku - i sam nie wiem jak do tego podejść.

model:

class User < ActiveRecord::Base attr_accessible :password, :salt, :username validates_uniqueness_of :username end
view:

[code]

<%= @title %>


<%= form_for :user do |f| %>
Tutaj trzeba jakoś wyświetlać błędy. ^-^

<%= f.label :"Nickname:" %>
<%= f.text_field :username %>

<%= f.label :"Password:" %>
<%= f.password_field :password %>

<%= f.submit :"Create an account" %>

<% end %>
If you already have account, please sign in <%= link_to "here", login_path %>.
<%= link_to "Back to home page", ucp_path %>.[/code] controller: [code]def register @title = "Register on User Control Panel" unless session[:user_id] if request.post? @user = User.new(params[:user]) if @user.save flash[:notice] = "User with login #{@user.username} was created! Please sign in now." session[:user_id] = @user.id redirect_to :action => :index end end else flash[:notice] = "You are logged, and what you want from register page?" redirect_to :action => :index end end[/code] Gdy używam: [code]<%= error_messages_for :user %>[/code] kod jednak nie chce zadziałać.

Proszę o szybką pomoc, z góry dziękuję!

if request.post?

:o co to jest? w railsach tworzy się oddzielne akcje dla GET, POST, PUT, DELETE, nie wrzuca się ich razem.

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

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

if @user.save
  redirect_to sign_in_path, notice: "User with login #{@user.username} was created! Please sign in now."
else
  render :new
end

end
end[/code]
akcja #new wyrenderuje ci formularz a #create spróbuje zapisać użytkownika. jeśli jej się uda to przeniesie na stronę logowania (sign_in_path - musisz to gdzieś sam zdefiniować) albo wyświetli widok #new z ustawioną zmienną @user więc wyświetli błędy

w widoku zmień tylko:

<%= form_for @user do |f| %>
  • zmienna zamiast symbolu

Edit:

a tak w ogóle to nie ma się co męczyć, do autentykacji jest gem - Devise. a jeżeli już chcesz robić ją sam od początku to obejrzyj sobie http://railscasts.com/episodes/250-authentication-from-scratch i może http://railscasts.com/episodes/283-authentication-with-sorcery

Chciałem to wykonać w routes tak aby link wyglądał http://localhost:3000/register.
Nie ma innej możliwości wykonania tego, tylko tak?

Jesli chcesz uzyc Devise, to przeciez masz wszystko ladnie opisane

przeczytaj http://guides.rubyonrails.org/routing.html, tam na pewno napisane jest jak zmienić nazwę routingu

zlw, próbowałem, i samo match mi nic nie dawało.

Może dlatego, że przy updacie wysyłasz dane w formie POST, nie GET.

http://guides.rubyonrails.org/routing.html#http-verb-constraints

Ostatni przykład punktu 3.7

Niby teraz routes sobie wszystkie poprawiłem, lecz mam problem - gdy ma wyskoczyć błąd (np. pole nie jest unikatowe albo za mało znaków) to nie wyskakuje błąd, tylko przekierowuje mnie na http://localhost:3000/users i wyskakuje:

[code]Template is missing

Missing template users/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in: * “/home/mateusz/RoR/usercp/app/views”[/code]
Moje routes.rb:

[code]Usercp::Application.routes.draw do

root :to => 'users#index'
match 'ucp', :to => 'users#index', :via => 'GET'
match 'users', :to => 'users#create', :via => 'POST'
match 'register', :to => 'users#new', :via => 'GET'
match 'login', :to => 'users#login'
match 'logout', :to => 'users#logout', :via => 'GET'[/code]

Z tego co widzę nie masz przewidziane w controller że mogą być błędy i chcesz wyświetlić jeszcze raz formularz z możliwością poprawienia błędów. Jest tylko opcja save lub że jesteś zalogowany dopisz sobie jeszcze else z render “new” w przypadku nie przejścia walidacji

def register @title = "Register on User Control Panel" unless session[:user_id] if request.post? @user = User.new(params[:user]) if @user.save flash[:notice] = "User with login #{@user.username} was created! Please sign in now." session[:user_id] = @user.id redirect_to :action => :index end end else flash[:notice] = "You are logged, and what you want from register page?" redirect_to :action => :index end end

Uff, działa… lecz jeszcze jeden malutki problemik. ;D
Jeżeli kliknę w zarejestruj się, ale mam błędy - i tak mnie przekierowuje na /users.
Jak to zmienić?
Chodzi mi głównie o ten problem, że przekierowuje na /users - a mam dynamicznie zmieniamy tytuł zmienną @title = “Register on User Control Panel”

Zamiast kasować posty pokaż kawałek kodu :wink: Napisałeś że twój kod wygląda już inaczej po czym skasowałeś post z nowym kodem i zadałeś kolejne pytanie ;D

Tamten kod co był to wkleiłem mój controller. :wink:

[code]def new
@title = “Register on User Control Panel”
unless session[:user_id]
@user = User.new
else
flash[:notice] = “You are logged, and what you want from register page?”
redirect_to :action => :index
end
end

def create
	@user = User.new(params[:user])
	if @user.save
		flash[:notice] = "User with login #{@user.username} was created! Please sign in now."
		session[:user_id] = @user.id
		redirect_to :action => :index
	else
		render :action => 'new'
	end
end[/code]

spróbuj redirect_to @user zamiast :action => index

Ale tutaj przecież w tej części o której mówimy nie ma :action => index tylko new. :wink:
Sęk w tym, że jeżeli kliknę w guzika z błędami przekierowuje on na:

users POST /users(.:format)    users#create

Nie ma szans, żeby zrenderował ci się URL /register, bo ścieżka ta reaguje tylko na GET. Bierzesz się za to od złej, PHP-owej strony, co się mocno rzuca w oczy. Zbuduj REST-owe ścieżki, dla usera (index, show, edit, update, create, new, destroy, cokolwiek jeszcze) i dopiero potem baw się w zamianę adresów, bo w tej chwili zaczynasz już mieszać i za chwilę ciężko będzie ci z tego wyjść…

http://guides.rubyonrails.org/getting_started.html#rest

[quote=konole]Nie ma szans, żeby zrenderował ci się URL /register, bo ścieżka ta reaguje tylko na GET. Bierzesz się za to od złej, PHP-owej strony, co się mocno rzuca w oczy. Zbuduj REST-owe ścieżki, dla usera (index, show, edit, update, create, new, destroy, cokolwiek jeszcze) i dopiero potem baw się w zamianę adresów, bo w tej chwili zaczynasz już mieszać i za chwilę ciężko będzie ci z tego wyjść…

http://guides.rubyonrails.org/getting_started.html#rest[/quote]
Fakt. :wink: Przechodzę aktualnie z php właśnie na ruby-ego.
A jakiś inny sposób na zamaskowanie tego URL /users jest? Żeby jakoś zamienić tą nazwę na coś innego?

Kolega @konole dobrze Ci radzi.

match '/whatever' => "controller#action", as: :whatever

Radził bym przerobić sobie :
http://guides.rubyonrails.org/index.html
http://www.codeschool.com/
i będzie na pewno znacznie łatwiej :wink:

Napisanie swojego uwiezytelnienia zalecaja nawet autorzy Device, wiec jest sens zeby sie meczyc :wink:

[quote=Device_README]If you are building your first Rails application, we recommend you to not use Devise. Devise requires a good understanding of the Rails Framework. In such cases, we advise you to start a simple authentication system from scratch, today we have two resources:

Once you have solidified your understanding of Rails and authentication mechanisms, we assure you Devise will be very pleasant to work with. :)[/quote]

Tylko po napisaniu trzeba ją wrzucić do kosza, a nie na produkcję.