未定义的方法`firstname'为零:NilClass Rails4

时间:2015-05-13 07:24:24

标签: ruby-on-rails ruby

有人可以帮我解决这个错误吗?我通过没有型号的控制台添加配置文件控数据库工作正常。我确信我在seed.rb中有姓氏和名字,我只做db:setup / migration。

这是show.html

.page-header
  .h1
    =link_to @user.firstname + " " + @user.lastname, edit_user_registration_path

数据库:

 create_table "users", force: true do |t|
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,     null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "firstname"
    t.string   "lastname"
    t.string   "username"
    t.boolean  "admin",                  default: false

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :reviews
  has_many :products

  validates_presence_of :firstname, :lastname
end

配置文件控制器:

class ProfileController < ApplicationController
  def show
    @user = User.find_by_username(params[:id])
    if @user
      @reviews=@user.reviews.order(:created_at).reverse_order.limit(5)
      render action: :show
    end
  end
end

3 个答案:

答案 0 :(得分:1)

这部分

@user = User.find_by_username(params[:id])

返回nil,因为您将id从params作为username传递到find_by_username查找器。无法找到username(字符串),即id(整数)。

应该是

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

Take a look at docs关于发现者的工作方式

答案 1 :(得分:0)

如果您使用的是find_by_username,那么您应该传递params [:username]而不是params [:id]。

答案 2 :(得分:0)

这一部分:

if @user
  @reviews=@user.reviews.order(:created_at).reverse_order.limit(5)
  render action: :show
end

即使if语句为false,仍会调用render action: :show - 它是默认语句。

如果你定义了一个什么都不说的方法:

def test
end

rails会调用:render action: :name_of_method

您需要使用重定向和unless

redirect_to users_url, notice: 'user not found' unless @user
祝你好运!