2016-05-17 18 views
0

私は他のSOの投稿を見てきましたが、なぜこのエラーメッセージがポップアップしているのかわかりません。私はページで各トレーニングのためにレンダリングされる私のworkoutモデルのために_template.html.erbパーシャルを持っています。Rubyエラー:未定義メソッド `name 'for nil:NilClass

workouts#indexページにアクセスしようとすると、@workout.nameと部分的にハイライト表示されているエラー​​が表示されます。完全な部分は次のとおりです。

<div class="container col-sm-6 col-md-4"> 
    <div class="card hoverable"> 
    <div class="card-image"> 
     <div class="view overlay hm-white-slight z-depth-1"> 
      <%#= link_to workout.workout_img class: "img-responsive" alt: "" %> 
      <div class="mask waves-effect"></div> 
     </div> 
     <span class="card-title"><%= @workout.name %></span> 
    </div> 
    <div class="card-content"> 
     <p><strong>Workout Type: </strong><%= @workout.workout_type %></p> 
     <p><strong>Goal: </strong><%= @workout.teaser %></p> 
     <p><%= @workout.description %></p> 
    </div> 
    <div class="card-action"> 
     <a class="red-text"><%= @workout.video %></a> 
    </div> 
    </div> 
</div> 

マイworkouts#indexページをレンダリングするために、これを使用して、部分:

<%= @workouts.each do |w| %> 
    <%= render "workouts/template" %> 
    <% end %> 

マイワークアウトモデルがちょうど完全を期すため、私は、これは物事をどのように影響するかが表示されない(が、日本酒):

class Workout < ActiveRecord::Base 
    belongs_to :user 
    has_many :exercises 
end 

マイワークアウトコントローラは次のとおりです。

class WorkoutsController < ApplicationController 
def index 
    @workouts = Workout.all 
end 

def show 
    @workout = Workout.find(params[:id]) 
end 

def new 
    @workout = Workout.new 
end 

def create 
    @workout = Workout.new 
    @workout.name = params[:workout][:name] 
    @workout.workout_type = params[:workout][:workout_type] 
    @workout.teaser = params[:workout][:teaser] 
    @workout.description = params[:workout][:description] 
    @workout.video = params[:workout][:video] 
    @workout.difficulty = params[:workout][:difficulty] 
    @workout.trainer = params[:workout][:trainer] 
    @workout.user_id = params[:workout][:user_id] 

    if @workout.save 
    flash[:notice] = "Workout was saved successfully." 
    redirect_to @workout 
    else 
    flash.now[:alert] = "Error creating workout. Please try again." 
    render :new 
    end 
end 

def edit 
    @workout = Workout.find(params[:id]) 
end 

def update 
    @workout = Workout.find(params[:id]) 

    @workout.name = params[:workout][:name] 
    @workout.workout_type = params[:workout][:workout_type] 
    @workout.teaser = params[:workout][:teaser] 
    @workout.description = params[:workout][:description] 
    @workout.video = params[:workout][:video] 
    @workout.difficulty = params[:workout][:difficulty] 
    @workout.trainer = params[:workout][:trainer] 
    @workout.user_id = params[:workout][:user_id] 

    if @workout.save 
    flash[:notice] = "Workout was updated successfully." 
    redirect_to @workout 
    else 
    flash.now[:alert] = "Error saving workout. Please try again." 
    render :edit 
    end 
end 

def destroy 
    @workout = Workout.find(params[:id]) 

    if @workout.destroy 
    flash[:notice] = "\"#{@workout.name}\" was deleted successfully." 
    redirect_to action: :index 
    else 
    flash.now[:alert] = "There was an error deleting the workout." 
    render :show 
    end 
end 
end 

最後に、私は@workout.nameを最初に試しましたが、undefined local variable or method 'workout' for #<#<Class:0x007fe1aa3ace68>:0x007fe1b4babdf8>というエラーが発生しました。この問題は解決しないと思います。

ご協力いただきましてありがとうございます。

答えて

1

テンプレート内で@workoutインスタンス変数を使用していますが、設定されていません。代わりに、インスタンス変数を使用しようと、呼び出し元のテンプレートでローカル変数を設定し、それを使用:ワークアウトで

/インデックスを、

<%= @workouts.each do |w| %> 
    <%= render "workouts/template", workout: w %> 
<% end %> 

を行うと、workoutで部分的に@workoutのすべてを置き換えます。

+0

優秀!ありがとうございました! – Liz

関連する問題