nil:NilClass 的默认视图未定义方法"name"出现问题



我在渲染视图时遇到问题。我想我知道为什么我会收到错误:

undefined method `name' for nil:NilClass

提取的源(围绕第 #21 行):(显示 18-24)

<ul>
     <%= form_tag(default_hero_user_path, :method=>'post') do %>
         <%= label_tag "Name" %>
         <%= text_field_tag "name", @user.default_hero.name %> #line 21
         <%= submit_tag 'Set hero', class: "btn btn-large btn-primary"  %>
     <% end %>
   </ul>

我知道你不能在 nil 对象上调用 .name,但我不明白为什么 @user.default_hero 是 nil。我希望用户能够设置他们的"英雄",但显然无法设置默认值。

这是用户控制器:

# creates or updates the default hero
def default_hero
 @user = User.find(params[:id])
 hero = @user.default_hero
 if hero.nil?
   # we don't have a default hero so we need to add one'
   hero = Hero.new
   @user.heros << hero
 end
 hero.default = true
 hero.name = params[:name]
 hero.save
 redirect_to @user # shows the user again to see any updates
end

这就是我认为我在设置默认视图时遇到问题的地方-

def show
@user = User.find(params[:id]) 
if @user.default_hero.nil?
  name = params[:q]
else
  name = @user.default_hero.name
end

感谢您的时间和关注,如果您能指出如何解决这个问题的正确方向,我将不胜感激。

您的show控制器操作没有多大意义。如果@user.default_hero.nil?,您正在设置一个局部变量(在视图中无法访问)。这不会完成任何操作,@user.default_hero仍将nil在视图中。

话虽如此,要摆脱您的错误,您可以简单地这样做:

<%= text_field_tag "name", @user.default_hero.nil? ? '' : @user.default_hero.name %>

根据您的评论,我会做这样的事情:

class User < ActiveRecord::Base
  has_many :heros
  def set_default_hero(name)
    hero = self.heros.find_by_name(name) # check if the hero exists already
    hero = self.heros.build(:name => name) if hero.nil? # new object if not
    hero.default = true # set it as default
    hero.save
  end
end

控制器:

def default_hero
  @user = User.find(params[:id])
  @user.set_default_hero(params[:name])
  redirect_to @user
end
def show
  @user = User.find(params[:id])
  @default_hero = @user.default_hero.nil? ? '' : @user.default_hero.name
end

视图:

<%= text_field_tag "name", @default_hero %>

你忽略了我关于params[:q]的问题,所以我不知道该怎么办。

最新更新