2010-08-04 5 views
1

Ребята, я новичок в рельсах и просто делаю свою первую регистрационную форму. У меня есть некоторые проверки, которые я хочу проверить на рельсы, но по какой-то причине он не показывает сообщения об ошибках.Рельсы, не отображающие сообщения об ошибках проверки

На просмотров/пользователь/signup.html.erb У меня есть этот

<h1>Register Now!</h1> 
<% form_for :user, @u, :url => { :action => "signup" } do |f| %> 
    <%= f.error_messages :header_message => "Please Try Again!", :message => "We had some problems processing your registration" %> 
    <%= f.label(:first, "First Name")%> 
    <%= f.text_field(:first) %><br/> 
    <%= f.label(:last, "Last Name")%> 
    <%= f.text_field(:last) %><br/> 
    <%= f.label(:username, "Username")%> 
    <%= f.text_field(:username) %><br/> 
    <%= f.label(:password, "Password")%> 
    <%= f.password_field(:password) %><br/> 
    <%= f.label(:password_confirmation, "Confirm Password")%> 
    <%= f.password_field(:password_confirmation) %><br/> 
    <%= f.label(:email, "E-mail")%> 
    <%= f.text_field(:email) %> <br/> 
    <%= f.label(:terms_of_service, "I agree to the terms of service") %> 
    <%= f.check_box(:terms_of_service) %><br/> 
    <%= f.submit("Sign Up")%> 
<% end %> 

На модели я следующее

class User < ActiveRecord::Base 
    validates_length_of :username, :within =>4..15 
    validates_length_of :password, :within => 3..520 
    validates_presence_of :first, :last, :username, :email, :password, :password_confirmation 
    validates_uniqueness_of :username, :email 
    validates_confirmation_of :password 
    validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "Invalid email" 
    validates_acceptance_of :terms_of_service, :message => "You must agree to our Terms of Service in order to create account" 
end 

контроллер

class UserController < ApplicationController 
    def index 
    @users = User.find(:all) 
    end 

    def signup 
    if !params[:commit] 
     render :action =>'signup' 
    else 
     @u = User.new 
     @u.first = params[:first] 
     @u.last = params[:last] 
     @u.email = params[:email] 
     @u.username = params[:username] 
     @u.password = params[:password] 
     @u.password_confirmation = params[:password_confirmation] 
     @u.terms_of_service = params[:terms_of_service] 
     if @u.valid? 
     @u.password = Digest::SHA512.hexdigest(params[:password]) 
     @u.password_confirmation = Digest::SHA512.hexdigest(params[:password_confirmation]) 
     @u.save! 
     render :action => 'success' 
     else 
     render :action => 'signup' 
     end 
    end 
    end 
end 

Edit: я обновил мой код по какой-то причине, теперь я не могу создать пользователя. это даст мне ошибки. Кто-нибудь знает, как обойти это?

+0

В вашем контроллере есть экземпляр пользователя, который вы пытаетесь сохранить с именем «@user»? – jdeseno

+0

jdeseno правильно, вы должны опубликовать свой код контроллера или просто показать действия и зарегистрироваться – Bohdan

+0

nevermind, я получил это исправление – denniss

ответ

7

Предполагая, что вы назвали Пользователь в вопросе, как @user в контроллере изменение формы

<% form_for :user, @user, :url => { :action => "signup" } do |f| %> 

Это может сработать, а

<% form_for @user, :url => { :action => "signup" } do |f| %> 

Тогда в изменении формы соответственно:

<%= f.label(:first, "First Name")%> 
<%= f.text_field :first %> 

Так что добавьте f. и удалите _tag на каждом из них.

И ErrorMessage часть к:

<%= f.error_messages :header => "Please complete all the fields", :message => "There is a problem with one or more fields" %> 

Не уверен, что о том, как: заголовок и: работа сообщение в этой последней, но я надеюсь, что вы получите эту идею.

ОБНОВЛЯТЬ теги формы, потому что у них была ошибка.

+1

Вы можете просто сделать '<% form_for @user do | f | %> 'nowadays, а Rails позаботятся об остальном, предполагая, что ресурсы настроены правильно. –

+0

Каким образом мой способ сделать это не работает? – denniss

+0

Не знаю. Я никогда не использовал error_messages_for -tag, но в документации указано, что error_messages_for «пользователь» может работать вместо error_messages_for: user (если вы назвали его @user), но это чистое предположение и интерпретация документации в api .rubyonrails.org. – pkauko

29

Проблема может заключаться в том, что вы используете redirect, а не render в вашем контроллере.

Сообщения об ошибках не перейдут на перенаправление (перенаправление заставляет ваш браузер немедленно запрашивать новую страницу).

Если вы используете рендер, то сообщения не будут потеряны.

+0

спасибо за указание на это, но я использую рендер. – denniss

+1

Из-за вашего ответа я понял, что при перенаправлении вспышка приходит после перенаправления. При повторном рендеринге страницы редактирования мне сначала нужно было выполнить флеш, а затем выполнить действие. – Tass

0

Другой проблемой может быть использование рельсов 3, которые удаляли error_messages в отдельный плагин.

Смежные вопросы