2017-08-03 16 views
1

私は最初に本質的にドロップダウンであるフォームを開発しています。あなたのいくつかの助けを借りて、私はこれまで成功してきたが、この時点で私は、アプリ/ index.html.erbページを作成しています:データを表示するためにインデックスページを作成する必要はありますか?

<% @jobs.each do |job| %> 
    <h2><%= @job.category %></h2> 
    <p><%= @job.poster %></p> 
<% end %> 

上記のコードは、次のエラーレンダリングされます。

NoMethodError in Jobs#index 
undefined method `category' for nil:NilClass 

私は、私が行ったカテゴリには何も付いていないと言っていたので、レールコンソールでカテゴリを更新しましたが、私はこのエラーを受け取り続けています。それ。

<h1><%= @job.category %></h1> 
<p><%= @job.poster %></p> 
<p><%= @job.location %></p> 
<p><%= @job.description %></p> 

<%= link_to "Home", root_path %> 

とそれだけで正常に動作します:私のアプリで

は/ show.html.erbコードは似ています。

これは部分的に私のフォームです:

<%= simple_form_for(@job, html: {class: 'form-horizontal'}) do |f| %> 
    <div class="control-group"> 
    <%= f.label "Poster:", class: 'control-label' %> 
    <div class="controls"> 
     <%= f.select(:poster, options_for_select([['Nick Maloney','Nick Maloney'], 
     ['Peter Brown','Peter Brown'],['Jen Morris','Jen Morris']])) %> 
    </div> 
    </div> 
    <div class="control-group"> 
    <%= f.label "Category:", class: 'control-label' %> 
    <div class="controls"> 
     <%= f.select(:category, options_for_select([['Landscaping','Landscaping'], 
     ['Babysitting','Babysitting'],['Tree planting','Tree planting']])) %> 
    </div> 
    </div> 
    <div class="control-group"> 
    <%= f.label "Location:", class: 'control-label' %> 
    <div class="controls"> 
     <%= f.select(:location, options_for_select([['Dorchester','Dorchester'], 
     ['Roxbury','Roxbury'],['Mattapan','Mattapan']])) %> 
    </div> 
    </div> 
    <div class="control-group"> 
    <%= f.label "Status:", class: 'control-label' %> 
    <div class="controls"> 
     <%= f.select(:status, options_for_select([['New','New'], 
     ['Pending','Pending'],['Complete','Complete']])) %> 
    </div> 
    </div> 
    <%= f.input :description, label: "Job Description" %> 
    <%= f.submit 'Add Job', class: 'btn btn-default' %> 
<% end %> 

と、これは私のjobs_controller.rbです:

class JobsController < ApplicationController 
    before_action :find_job, only: [:show, :edit, :update, :destroy] 

    def index 
    @jobs = Job.all.order("created_at DESC") 
    end 

    def show 

    end 

    def new 
    @job = Job.new 
    end 

    def create 
    @job = Job.new(jobs_params) 

    if @job.save 
     redirect_to @job, notice: 'Your job was successfully added' 
    else 
     render "New" 
    end 
    end 

    def edit 

    end 

    def update 

    end 

    def destroy 

    end 

    private 

    def jobs_params 
    params.require(:job).permit(:poster, :category, :location, :status, :description) 
    end 

    def find_job 
    @job = Job.find(params[:id]) 
    end 
end 

答えて

1

それはあなたがjobsを反復時にブロックを割り当てることに注意し、@jobを持ってどのような値に依存します変数jobと呼ばれますが、内部で@jobというカテゴリ属性を取得したい場合、Railsはその変数がどこから来て、どのような値であるかを知ろうとします。

job.attributeを試してみてください:あなたのインデックスメソッドは、すべてのジョブレコードを持つ@jobs変数を持っているので、

<% @jobs.each do |job| %> 
    <h2><%= job.category %></h2> 
    <p><%= job.poster %></p> 
<% end %> 

@jobは、あなたのindexビューでは使用できません。そして、表示方法で@job.categoryにアクセスできる理由は、@jobという変数がプライベートメソッドfind_jobで作成されていて、そのようなメソッドで利用可能であるため、before_actionコールバックが2行目に設定されているためです。

関連する問題