1

ビューをレンダリングするのに問題があります。エラーが発生する理由を知っていると思います:

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

これを解決する方法について正しい方向に私を向けることができれば、皆さんの時間と注意に感謝します.

4

1 に答える 1

2

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]ので、どうすればよいかわかりません。

于 2012-08-11T05:00:01.467 に答える