2015-09-10 2 views
1

Я работаю над Rails 4 App, один из моих модулей - это общий отчет о патрулировании, в котором пользователь создает отчет, основанный на его/ее старте/остановке сдвига. после создания отчета у них есть возможность вернуться в представление отчета и добавить отчет о патрулировании.NoMethodError Rails 4 App -> Проблема с вложенным атрибутом

Каждая вещь работает с представлением формы gen_rep_ent.

Специфическая ошибка, я получаю:

undefined method `general_report=' for #<GenRepEnt:0x007f871d9ea150> 

следуют:

def create    
    @general_report = GeneralReport.find(params[:general_report_id]) 
    @gen_rep_ent = GenRepEnt.new(gen_rep_ent_params) 
    @gen_rep_ent.general_report = @gen_rep_ent <-- Problem Line 

    respond_to do |format| 
     if @gen_rep_ent.save 
     format.html { redirect_to @general_report, notice: 'General Report Entry was successfully created.' } 
     format.json { render :show, status: :created, location: @general_report} 
     else 
     format.html { render :new } 
     format.json { render json: @general_report.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Это третья линия, которая вызывает здесь проблему.

Моя модель general_report имеет следующее соотношение:

has_many :gen_rep_ents, dependent: :destroy 

Мои Маршруты файл выглядит следующим образом:

Rails.application.routes.draw do 

    resources :mobile_alarm_reports 

    resources :mobile_incident_reports 

    resources :static_incident_reports 

    resources :general_reports do 
    resources :gen_rep_ents, except: [:index], controller: 'general_reports/gen_rep_ents' 
    end 

    resources :visitor_parkings 

    resources :residents 

    resources :sites 

    devise_for :users, controllers: { registrations: "registrations" } 

    # Adds Static Pages 
    root 'home#index' 

    get 'home/about' 

    get 'home/contact' 

    get 'home/pricing' 

Моего шоу файл выглядит следующим образом:

<% @gen_rep_ents.each do |gen_rep_ent| %> 
    <table> 
    <thead> 
     <tr> 
     <th>Time</th> 
     <th>Report</th> 
     </tr>  
    </thead> 
    <tbody> 
     <tr> 
     <td><%= gen_rep_ent.time %></td> 
     <td><%= gen_rep_ent.report %></td> 
     </tr> 
    </tbody> 
    <% end %> 
    </table> 

gen_rep_ents_controller.rb: < - Вложенный элемент

class GeneralReports::GenRepEntsController < ApplicationController 
    before_action :set_gen_rep_ent, only: [:show, :edit, :update, :destroy] 

    # GET /gen_rep_ents 
    # GET /gen_rep_ents.json 
    def index 
    @gen_rep_ents = GenRepEnt.all 
    end 

    # GET /gen_rep_ents/1 
    # GET /gen_rep_ents/1.json 
    def show 
    end 

    # GET /gen_rep_ents/new 
    def new 
    @general_report = GeneralReport.find(params[:general_report_id]) 
    @gen_rep_ent = GenRepEnt.new 
    end 

    # GET /gen_rep_ents/1/edit 
    def edit 
    end 

    # POST /gen_rep_ents 
    # POST /gen_rep_ents.json 
    def create 
    @general_report = GeneralReport.find(params[:general_report_id]) 
    @gen_rep_ent = GenRepEnt.new(gen_rep_ent_params) 
    @gen_rep_ent.general_report = @gen_rep_ent 

    respond_to do |format| 
     if @gen_rep_ent.save 
     format.html { redirect_to @general_report, notice: 'General Report Entry was successfully created.' } 
     format.json { render :show, status: :created, location: @general_report} 
     else 
     format.html { render :new } 
     format.json { render json: @general_report.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /gen_rep_ents/1 
    # PATCH/PUT /gen_rep_ents/1.json 
    def update 
    respond_to do |format| 
     if @gen_rep_ent.update(gen_rep_ent_params) 
     format.html { redirect_to @gen_rep_ent, notice: 'General Report Entry was successfully updated.' } 
     format.json { render :show, status: :ok, location: @gen_rep_ent } 
     else 
     format.html { render :edit } 
     format.json { render json: @gen_rep_ent.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /gen_rep_ents/1 
    # DELETE /gen_rep_ents/1.json 
    def destroy 
    @gen_rep_ent.destroy 
    respond_to do |format| 
     format.html { redirect_to gen_rep_ents_url, notice: 'General Report Entry was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_gen_rep_ent 
     @gen_rep_ent = GenRepEnt.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def gen_rep_ent_params 
     params.require(:gen_rep_ent).permit(:time, :report, :general_report) 
    end 
end 

general_reports_controller: < - Родитель Item

class GeneralReportsController < ApplicationController 
    before_action :set_general_report, only: [:show, :edit, :update, :destroy] 

    # GET /general_reports 
    # GET /general_reports.json 
    def index 
    @general_reports = GeneralReport.all 
    end 

    # GET /general_reports/1 
    # GET /general_reports/1.json 
    def show 
    @general_report = GeneralReport.find(params[:id]) 
    @gen_rep_ents = @general_report.gen_rep_ents 
    end 

    # GET /general_reports/new 
    def new 
    @general_report = GeneralReport.new 
    end 

    # GET /general_reports/1/edit 
    def edit 
    end 

    # POST /general_reports 
    # POST /general_reports.json 
    def create 
    @general_report = GeneralReport.new(general_report_params) 

    respond_to do |format| 
     if @general_report.save 
     format.html { redirect_to @general_report, notice: 'General report was successfully created.' } 
     format.json { render :show, status: :created, location: @general_report } 
     else 
     format.html { render :new } 
     format.json { render json: @general_report.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /general_reports/1 
    # PATCH/PUT /general_reports/1.json 
    def update 
    respond_to do |format| 
     if @general_report.update(general_report_params) 
     format.html { redirect_to @general_report, notice: 'General report was successfully updated.' } 
     format.json { render :show, status: :ok, location: @general_report } 
     else 
     format.html { render :edit } 
     format.json { render json: @general_report.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /general_reports/1 
    # DELETE /general_reports/1.json 
    def destroy 
    @general_report.destroy 
    respond_to do |format| 
     format.html { redirect_to general_reports_url, notice: 'General report was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_general_report 
     @general_report = GeneralReport.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def general_report_params 
     params.require(:general_report).permit(:user_id, :site_id, :date, :shift_start, :shift_end, :gp_number) 
    end 
end 

Я не слишком уверен, куда я иду неправильно с этим, как я просмотрел учебник снова и снова, и все это от того, что матчи Я вижу.

EDIT # 1

моя GenRepEnt модель выглядит следующим образом:

class GenRepEnt < ActiveRecord::Base 

    belongs_to :general_report 

end 

EDIT # 2

После выполнения миграции и добавления BELONGS_TO: general_report модели я получаю следующая погрешность:

ActiveRecord::AssociationTypeMismatch in GeneralReports::GenRepEntsController#create

+0

Как выглядит модель 'GenRepEnt'? –

+0

Бланки без ничего в нем. –

+0

Было сказано, что многие из них сделают все это работой –

ответ

1

Похоже, вы пытаетесь установить general_report на экземпляр класса GenRepEnt, но этот метод не существует. Вероятно, это связано с тем, что ассоциация не была настроена в модели GenRepEnt.

В модели gen_rep_ent.rb добавить следующую ассоциацию:

belongs_to :general_report 

После того, как вы заявляете, это объединение Rails будет определять несколько методов на каждом экземпляре GenRepEnt включая:

general_report 
general_report= 

Вы также должны создайте миграцию, которая добавит новый столбец, general_report_id, в таблицу gen_rep_ents.

В терминальному перспективе rails g migration AddGeneralReportRefToGenRepEnts general_report:references

Это должно генерировать миграции, которая выглядит примерно так:

class AddGeneralReportRefToGenRepEnts < ActiveRecord::Migration 
    def change 
    add_reference :gen_rep_ents, :general_report, index: true, foreign_key: true 
    end 
end 

Далее запустите миграцию с помощью rake db:migrate и перезапустить приложение.

Подробнее о принадлежности принадлежности к сообществу here.

+0

поэтому после того, как я добавил own_to: general_report в модель GenRepEnt, я получаю ту же самую ошибку после перезапуска сервера и выходил из системы и записывался в приложение ...? –

+0

, который работал, я думаю, однако теперь я получаю следующее (плохо также вопрос об обновлении) ActiveRecord :: AssociationTypeMismatch в GeneralReports :: GenRepEntsController # создает и по-прежнему проверяет ту же старую проблему. –

Смежные вопросы