ruby-on-rails-4 - 未定义方法 `[]' 为 nil :NilClass railstutorial. org 8.20 >

标签 ruby-on-rails-4 railstutorial.org

我正在学习 Michael Hartl 的 rails-tutorials,它真的很有趣! 但是我在列出 8.20 等之后遇到了麻烦。 因为我猜我做了一个 type-o 我擦掉了应用程序并再次从头开始.. 最好的学习方法是重复,对吗?

嗯..在第二个构建中我也遇到了同样的错误。

>    NoMethodError in SessionsController#create
undefined method `[]' for nil:NilClass

Extracted source (around line #7):


6  def create
7    user = User.find_by(email: params[:session][:email].downcase)
8    if user && user.authenticate(params[:session][:password])
9      sign_in user
10    else

谷歌搜索几个小时后,我尝试重置数据库(删除/创建/迁移测试:准备)

我试过从示例中复制代码片段(例如 Controller /助手/ View ) 但我似乎找不到解决办法。

代码如下

session_controller:

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
  end
end

session 助手:

module SessionsHelper


 def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    remember_token  = User.encrypt(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def current_user?(user)
    user == current_user
  end

    def sign_out
    current_user.update_attribute(:remember_token,
                                  User.encrypt(User.new_remember_token))
    cookies.delete(:remember_token)
    self.current_user = nil
  end



end

用户模型

class User < ActiveRecord::Base
    before_save {self.email = email.downcase }
    before_create :create_remember_token

    validates :name, presence: true, length: { maximum: 50 }
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX}, 
            uniqueness: {case_sensetive: false}
    has_secure_password
    validates :password, length: { minimum: 3 }

    def User.new_remember_token
        SecureRandom.urlsafe_base64
           # SecureRandom.urlsafe_base64

    end

    def User.encrypt(token)
        Digest::SHA1.hexdigest(token.to_s)
    end


        private
        def create_remember_token
            self.remember_token = User.encrypt(User.new_remember_token)
        end
end

用户 Controller

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def show
    @user = User.find(params[:id])
  end

  def create
    @user = User.new(user_params)
    if @user.save
        flash.now[:succes] = "Welcome to the sample app"
      redirect_to @user
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

用户助手

module UsersHelper

  # Returns the Gravatar (http://gravatar.com/) for the given user.
  def gravatar_for(user, options = { size: 50 })
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end

如何正确复制粘贴错误日志?

最佳答案

根据您遇到的错误,问题显然出在您的用户 Controller 中:

def create
  user = User.find_by(email: params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    sign_in user
  else
    flash.now[:error] = 'Invalid email/password combination'
    render 'new'
  end
end

错误的产生是因为 params[:session] 实际上是 nil。现在的问题是,为什么?

我的猜测是您的登录表单中有错字,应该是:

<%= form_for(:session, url: sessions_path) do |f| %>

  <%= f.label :email %>
  <%= f.text_field :email %>

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

  <%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
<% end %>

请确保 :session 的输入正确。

关于ruby-on-rails-4 - 未定义方法 `[]' 为 nil :NilClass railstutorial. org 8.20 >,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805842/

相关文章:

ruby-on-rails - 测试 rspec Hartl 教程第 10.3.3 章

ruby-on-rails - cloud9 ide 是否有 ruby​​ on rails 服务器端调试器?

css - Ruby on Rails 4 重新请求状态进度条

ruby-on-rails - 尝试从外部 URL 检索数据时出现错误消息

ruby-on-rails - 是否可以在 RoR 项目的根级别为不同的应用程序保留不同的文件夹

ruby-on-rails - 在学习 Ruby On Rails 教程之后,无法将用户添加到数据库

ruby-on-rails - 这些错误消息是什么意思?

ruby-on-rails - 使用自定义异常时未初始化的常量

ruby-on-rails - 在 Rails 4 下设计 3 中的自定义用户字段

ruby-on-rails - $ bundle exec rake db :reset command raising couldn't drop db/development. sqlite3