如何在ROR中解决NoMethodError

时间:2014-12-11 11:15:27

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个登录页面,我想通过提交电子邮件ID和密码登录。但是当我输入正确的电子邮件ID和密码时,我收到的错误如下所示。

错误:

NoMethodError in SessionsController#create
undefined method `authenticate' for #<Class:0x502b300>

提取的来源(第6行):

  def create
    user = User.where(:email => params[:session][:email].downcase).first
    if user && User.authenticate(params[:session][:password])
     redirect_to:action => 'users/show'
    else
     render 'new'
  end

Rails.root:c:/Site/loginuser

我将在下面提供我的所有代码段。

在app / views / users / new.html.erb中:

<%= form_for(:session, url:"add" ) do |f| %> 
                                <h1>Log in</h1> 
                                <p> 
                                    <label for="username" class="uname" data-icon="u" > Your email or username </label>
                                    <%= f.text_field:email,placeholder:"Enter your registered email" %>
                                </p>
                                <p> 
                                    <label for="password" class="youpasswd" data-icon="p"> Your password </label>
                                    <%= f.password_field:password,placeholder:"Enter your password" %>
                                </p>
                                <p class="keeplogin"> 
                                    <input type="checkbox" name="loginkeeping" id="loginkeeping" value="loginkeeping" /> 
                                    <label for="loginkeeping">Keep me logged in</label>
                                </p>
                                <p class="login button">
                                    <%= f.submit:"Login" %>                             
                                </p>
                                <p class="change_link">
                                    Not a member yet ?
                                    <a href="#toregister" class="to_register">Join us</a>
                                </p>
                            <% end %>

在app / controller / sessions_controller.rb

class SessionsController < ApplicationController
  def new
  end
  def create
 user = User.where(:email => params[:session][:email].downcase).first
  if user && User.authenticate(params[:session][:password])
  redirect_to:action => 'users/show'
  else
    render 'new'
  end
  end
end

在config / routes.rb

Rails.application.routes.draw do
  get 'sessions/new'

  get 'users/new'

  get 'users/show'
  post   'users/add'   => 'sessions#create'
  resources:users
  resources :sessions


end

有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您尚未指定在user.rb中是否有按名称进行身份验证的方法。

如果您已在user.rb中使用该方法,请确保在方法定义中使用 self.authenticate 而不是简单的身份验证

上述原因是,在Ruby类中创建方法时,您需要将该方法与该类的实例相关联,以便从该类中访问该方法。

请参阅此链接以获取更多信息http://railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/