2015-01-14 4 views
0

Это ошибка, я получаю, когда я пытаюсь заполнить форму книги: undefined method 'books' for nil:NilClass & он выделяет эту строку: @book = @owner.books.build(params[:book])связь между двумя моделями

Это то, что я сделал до сих пор:

Что я пропал без вести?

две модели: владелец и книга

Вот схема

create_table "books", force: :cascade do |t| 
    t.string "title" 
    t.string "isbn" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "owner_id" 
end 

add_index "books", ["owner_id"], name: "index_books_on_owner_id" 

create_table "owners", force: :cascade do |t| 
    t.string "first_name" 
    t.string "last_name" 
    t.string "email" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 
end 

Вот модели:

class Owner < ActiveRecord::Base 
    has_many :books 
end 

class Book < ActiveRecord::Base 
    belongs_to :owner 
    validates :owner_id, presence: true 
end 

Это в книге контроллера:

def create 
    @book = @owner.books.build(params[:book]) 
    respond_to do |format| 
    if @book.save 
     format.html { redirect_to @book, notice: 'Book was successfully created.' } 
     format.json { render :show, status: :created, location: @book } 
    else 
    format.html { render :new } 
    format.json { render json: @book.errors, status: :unprocessable_entity } 
    end 
    end 
    end 

EDIT

Это контроллер владельца:

def create 
     @owner = Owner.new(owner_params) 

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

EDIT 2

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

    # Never trust parameters from the scary internet, only allow the white list through. 
    def owner_params 
     params.require(:owner).permit(:first_name, :last_name, :email, :title, :isbn) 
    end 

** EDIT 3 **

Метод, который я использовал в книге контроллер в создании появился из этого stack

+0

Ваш объект '@ owner' равен нулю. Как вы устанавливаете объект '@ owner'? – Masudul

+0

@ Масуд, что ты имеешь в виду? Извините, я все еще размышляю над материалом ROR. – user273072545345

+0

Есть ли способ 'before_action' set_owner для действия' create'? – Masudul

ответ

0

Ошибка ясно говорит о том, что @owner равен нулю. В BooksController вам нужно получить объект @owner. Поскольку владелец и книги имеют вложенную ассоциацию. Таким образом, вы должны определить маршруты, как:

resources :owners do 
    resources :books 
end 

В BooksController

class BooksController < ApplicationController do 

    def create 
    @owner=Owner.find(params[:id]) 
    @book = @owner.books.build(params[:book]) 
    .... 
    end 
end 

Для получения дополнительной информации, внимательно посмотреть на Getting Started Статья-комментарий, например ассоциации.

+0

Это то, что я получил: 'Не удалось найти Owner с 'id' =', когда я ввел этот '@ owner = Owner.find (params [: id])' в метод создания контроллера книги. – user273072545345

+0

Действительно ли мне нужно гнездовать книги у владельцев? Я думал, что можно обойтись без этого? Я понимаю, почему вы думаете, что на основе метода, который я использовал в создании книги ... но это не было моим намерением. Неужели я ошибаюсь, думая, что можно связать книги и владельцев без необходимости их гнездовать? – user273072545345

+0

Метод, который я ввел в метод контроллера книги, пришел из этого сообщения: http: // stackoverflow.ком/вопросы/11354724/как к созданию-ан-ассоциации-между-двумя рельсами-моделей – user273072545345

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