2013-06-04 3 views
0

Я пытаюсь создать form_for для создания модели соединения между двумя другими моделями. У меня есть модель книги и модель пользователя, а другая называется Reads, это мое соединение. Вот как я создал ассоциации:Rails form_for и has_many через аргумент error

class User < ActiveRecord::Base 
    has_many :reads 
    has_many :books, :through => :reads 
end 

class Book < ActiveRecord::Base 
    has_many :reads 
    has_many :users, :through => :reads 
end 

class Read < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :user 
end 

Я посмотрел на документы для form_for и смотрели эпизод railscast на многие-ко-многим ассоциаций, но я не могу понять, почему я м получают ошибку, когда я пытаюсь сделать Книжный # показать вид, где я положил форму:

First argument in form cannot contain nil or be empty 

Вот моя форма в приложении/просмотрах/книгах/show.html.erb:

<%= form_for(@read) do |f| %> 
    <%= f.hidden_field :book_id, value: @book.id %> 
    <%= button_to 'Add to Reads', {controller: 'reads', action: 'create'}, {class: 'btn'} %> 
<% end %> 

Я думаю, что часть проблемы в том, что я пытаюсь чтобы создать объект Reads из модели Books, но я не уверен, что я делаю неправильно. Мне нужна кнопка «Добавить для чтения» на странице книги, чтобы пользователь мог выбрать эту книгу, чтобы добавить к своим «чтению». Я также добавляю идентификатор current_user в контроллере, а не в представлении. Вот мои действия создают из Считывает контроллер, если это помогает ...

def create 
    @read = Read.new(read_params) 
    @read.user_id = current_user.id 
    @read.save 
    if @read.save 
    # do this 
    else 
    # do that 
    end 
end 

И я использую сильный Params ...

def read_params 
    params.require(:read).permit(:user_id, :book_id) 
end 

Спасибо за любую помощь.

ответ

0

Первый аргумент в виде не может содержать ноль или быть пустым

Это означает, что в вашей форме nil. Поскольку вы находитесь в действии show вашего контроллера Books, вы должны определить эту переменную в контроллере книг.

def show 
    @read = Read.new 
    ... 
end 
+0

Ничего себе, это имеет смысл. Спасибо за совет. –

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