2015-08-12 2 views
1

Я совершенно не уверен, почему я получаю эту ошибку - я считаю, что я определили мои переменную правильно в моем контроллере отчета - это не имеет смысла для меня почему Я получаю ошибку. Любая помощь в понимает, что это будет очень признательно.неопределенного метод `model_name» для NilClass: Класс - rails4

я в настоящее время получаю сообщение об ошибке

undefined method `model_name' for NilClass:Class 

enter image description here

консоль

Rendered reports/_form.html.erb (4.6ms) 
    Rendered shared/_content_advert_show.html.erb (7.8ms) 
    Rendered adverts/show.html.erb within layouts/application (10.3ms) 
Completed 500 Internal Server Error in 16ms (ActiveRecord: 0.5ms) 

NoMethodError - undefined method `model_name' for NilClass:Class: 
    actionpack (4.1.10) lib/action_controller/model_naming.rb:9:in `model_name_from_record_or_class' 
    actionview (4.1.10) lib/action_view/record_identifier.rb:47:in `dom_class' 
    simple_form (3.0.2) lib/simple_form/action_view_extensions/form_helper.rb:58:in `simple_form_css_class' 
    simple_form (3.0.2) lib/simple_form/action_view_extensions/form_helper.rb:19:in `simple_form_for' 
    app/views/reports/_form.html.erb:1:in `_app_views_reports__form_html_erb__795468471443709165_70250827830400' 
    actionview (4.1.10) lib/action_view/template.rb:145:in `block in render' 
    activesupport (4.1.10) lib/active_support/notifications.rb:161:in `instrument' 

схема

create_table "reports", force: true do |t| 
    t.text  "content" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.integer "category_report_id" 
    end 

    create_table "category_reports", force: true do |t| 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

report.rb

class Report < ActiveRecord::Base 
    belongs_to :category_report 
    has_many :adverts 
end 

catergory_report.rb

class CategoryReport < ActiveRecord::Base 
    has_many :reports 
    has_many :adverts 
end 

advert.rb

class Advert < ActiveRecord::Base 
    belongs_to :report 
    belongs_to :category_report 
end 

отчеты/_form.html.erb

<%= simple_form_for(@report) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.association :category_report, collection: CategoryReport.all, prompt: "please choose", required: true, label: 'report this advert' %> 
    <%= f.input :content %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit, "send report" %> 
    </div> 
<% end %> 

reports_controller.rb

class ReportsController < ApplicationController 
    respond_to :html, :xml, :json 
    before_action :set_report, only: [:show, :edit, :update, :destroy] 

    def index 
    @reports = Report.all 
    respond_with(@reports) 
    end 

    def show 
    respond_with(@report) 
    end 

    def new 
    @report = Report.new 
    respond_with(@report) 
    end 

    def edit 
    end 

    def create 
    @report = Report.new(report_params) 
    @report.save 
    respond_with(@report) 
    end 

    def update 
    @report.update(report_params) 
    respond_with(@report) 
    end 

    def destroy 
    @report.destroy 
    respond_with(@report) 
    end 

    private 
    def set_report 
     @report = Report.find(params[:id]) 
    end 

    def report_params 
     params.require(:report).permit(:content, :category_report_id) 
    end 
end 

seed.rb

CategoryReport.delete_all 
crt1 = CategoryReport.create!(name:'spam') 
crt2 = CategoryReport.create!(name:'disturbing content') 
crt3 = CategoryReport.create!(name:'incorrect information') 
+0

никто не будет, вероятно, будет в состоянии сказать вам, если вы не предоставите объект Params от контроллера и маршрут, который вы пытаетесь ударить. Возможно ли, что маршрут шоу вложен? –

+1

На основании вашего снимка экрана вы запрашиваете '/ userrs/18/adsverts/65' (есть ли конкретная причина для двойного 'r' в userrs?). Я предполагаю, что вы используете маршруты Rails по умолчанию, поэтому вы запрашиваете действие 'show' из' AdvertsController', а не 'ReportController'. Вы устанавливаете '@ report' в действии' show' из 'AdvertsController'? –

ответ

0

Ваш before_action :set_report, only: [:show, :edit, :update, :destroy] в ReportsController. Контроллер, вызывающий ошибку, - AdvertsController. Вам также нужно установить отчет в этом контроллере.

Если у вас есть это во многих местах, вы можете рассмотреть возможность переноса метода на ApplicationController.

Вместо @report и перед фильтром, вы можете также рассмотреть что-то вроде:

helper_method: :report 

def report 
    @_report ||= params[:id] ? Report.find(params[:id]) : Report.new 
end 
Смежные вопросы