2012-04-20 108 views
0

當我在鏈接點擊標誌應該檢查有效的用戶名和密碼,並顯示在頁面的一部分,這是我在顏色框的彈出我打電話標誌的消息,但我不能夠顯示錯誤信息。模型驗證錯誤消息都沒有得到顯示

這是我的LoginController:

def login 
    if request.post? 
    @user = User.new(params[:user]) 
    user=User.authenticate(params[:username], params[:password]) 
    if user.nil? 
    flash[:error] = 'Login unsuccessful' 
     redirect_to :back 
    else 
     flash[:notice] = 'Login successful' 
     session[:user] = user.id 
     redirect_to :controller=>'users', :action => 'show',:username=>user.username 
    end 
    end  
end 

User.rb:

def self.authenticate(username, pass) 
    user = find(:first, :conditions=>["username = ?", username]) 
    return nil if user.nil? 
    return user if User.hash_password(pass) == user.password && username == user.username 
    nil 
end 

在我看來page_sign_in.html.erb

<%= form_for @user, :url=>{:controller=>"logins",:action=>"login"},:remote=>true,:html=>{ :onSubmit => "return checkSignupValidation()",:id=>"signin_form", :multipart=>true} do |f| %> 

@user是給錯誤:undefined method MODEL_NAME」的Nilclass`

回答

0

你的問題是,沒有爲登錄沒有模型 - 有沒有需要。你不希望使用form_for,使用替代form_tag

<%= form_tag controller: "logins", action: "login", etc.. do %> 
    <%= text_field_tag :username %> 
    <%= password_field_tag :password %> 
<% end %> 

那我就推薦了一些改進措施,你的控制器:

def login 
    if request.post? 
    user = User.authenticate(params[:username], params[:password]) 
    if user.nil? 
     flash[:error] = 'Login unsuccessful' 
     redirect_to :back #I try to avoid :back, it feels better to use a fixed path 
    else 
     flash[:notice] = 'Login successful' 
     session[:user] = user.id 
     redirect_to :controller=>'users', :action => 'show', :username=>user.username 
    end 
    end  
end 

你不需要@user變量,所以只是避免不必要的數據庫查詢。我不知道它是否如此好使用:回來,我總是嘗試使用固定的路徑。

+0

日Thnx klump.wht我應該指定,而不是回到becoz我想,如果用戶登錄失敗,再次呈現相同的登錄彈出。 – sonalkumar 2012-04-20 11:37:57

+0

是的,它是你使用的登錄方法?然後你可以嘗試像'controller:login,action:login'這樣的東西... – klump 2012-04-20 14:40:18