1

これが私のコードです:

// swimmer.rb (モデル) 内:

    belongs_to :user

// user.rb (モデル):

    has_one :swimmer, :dependent => :destroy
    accepts_nested_attributes_for :swimmer, :allow_destroy => true   
    attr_accessible :swimmer_attributes

// swimmers_controller.rb 内:

  def profile
    @swimmer = Swimmer.find_by_user_id(current_user)
    @swimmer_nickname = @swimmer.nickname
    @swimmer_gender = @swimmer.gender
    @title = "Swimmer Profile for #{@current_user.email}"
  end

// profile.html.erb 内 (swimmers ビュー フォルダー内)

   <% if @swimmer %>
     <h3><%= @title %></h3>
     <p>Nickname: <%= @swimmer_nickname %></p>
     <p>Gender: <%= @swimmer_gender %></p>
   <% else %>
     <h3>No Swimmer Profile for<%= current_user.email %></h3>
   <% end %>

(Devise gem を使用して) ログインしているユーザーがいて、そのユーザーに対してスイマーが作成されているため、swimmers#controller メソッドの @swimmer インスタンス変数と一致する user_id がスイマー オブジェクトにある場合、プロファイル ビューは次のように機能します。意図されました。そうでない場合、ページに次のエラーが表示されます。

   NoMethodError (undefined method `nickname' for nil:NilClass):
     app/controllers/swimmers_controller.rb:66:in `profile'

しかし、プロファイル ビューには if/else 条件があるため、ログインしているユーザーに関連付けられているスイマー オブジェクトをなくして、ビューに else コンテンツを強制的に表示させたいと考えています。どうやら、「Swimmer.find_by_user_id(current_user)」メソッドは NilClass に nil オブジェクトを作成しています。何も作成せず、else 条件を表示するようにするにはどうすればよいですか?

リポジトリはhttps://github.com/drollwit/vst2/tree/ver2にあります。これは演習であり、実際のプロジェクトではありません。ここにはおそらく簡単な答えがありますが、私はそれを理解できません(まだRailsの基礎を学んでいます)。どんな助けでも大歓迎です。

4

2 に答える 2

1

エラーの原因は、以下のコード行にあります。

@swimmer = Swimmer.find_by_user_id(current_user)

user_id に基づいて Swimmer を見つけることはありません。

find_by_user_id

ID が必要です。

@swimmer = Swimmer.find_by_user_id(current_user.id)

スイマー オブジェクトを取得すると、エラーは発生しません。

また、ファイルを表示するには、次の方法で改善できます

<% if @swimmer %>
 <h3><%= "Swimmer Profile for #{@current_user.email}" %></h3>
 <p>Nickname: <%= @swimmer.nickname %></p>
 <p>Gender: <%= @swimmer.gender %></p>
<% else %>
 <h3>No Swimmer Profile for<%= current_user.email %></h3>
<% end %>

これにより、コントローラーからの以下のコード行が削減されます。

@swimmer_nickname = @swimmer.nickname
@swimmer_gender = @swimmer.gender
@title = "Swimmer Profile for #{@current_user.email}"
于 2012-04-18T07:16:20.640 に答える
1

問題はビューではなく、プロファイル メソッドです。

def profile
  @swimmer = Swimmer.find_by_user_id(current_user)
  @swimmer_nickname = @swimmer.nickname
  @swimmer_gender = @swimmer.gender
  @title = "Swimmer Profile for #{@current_user.email}"
end

スイマーが見つからない場合、@swimmer は nil であり、nil でメソッド 'nickname' を呼び出しているため、次の行は失敗します。

簡単な修正は次のとおりです。

def profile
  @swimmer = Swimmer.find_by_user_id(current_user)
  @swimmer_nickname = @swimmer.try(:nickname)
  @swimmer_gender = @swimmer.try(:gender)
  @title = "Swimmer Profile for #{@current_user.email}"
end

@swimmer が存在しない場合、@simmwer_nickname と @swimmer_gender は nil に設定されます。http://api.rubyonrails.org/classes/NilClass.html#method-i-tryを参照してください。

個人的には、このようにコントローラーにこれらの追加のインスタンス変数を割り当てません。これをビューまたはヘルパーに移動します。

于 2012-04-18T05:44:28.377 に答える