Рельсы 3 - таблица не обновляется при создании нового HABTM ассоциации


Я потратил на это последние три дня и нигде не могу найти ответа. Я пытаюсь изучить Rails, и я начал с того, что казалось довольно простым приложением.

У меня есть 2 модели:

class Album < ActiveRecord::Base

  has_and_belongs_to_many :users

  attr_accessible :title

end

И

class User < ActiveRecord::Base

  has_and_belongs_to_many :albums

  attr_accessible :first_name, :last_name

end

Я также создал таблицу соединений

create_table "albums_users", :id => false
    t.integer "album_id"
    t.integer "user_id"

Мои пользователи / показать.формат html.erb файл содержит форму

<%= form_for([@user, @user.albums.build]) do |f| %>

Когда эта форма отправляется, она вызывает my album#create controller

  def create
    @user = User.find(params[:user_id])
    @album = @user.albums.cre(params[:album])  
    @album.save
  end 

Это создает новый альбом, но не создает запись в соединении стол.

При просмотре параметров хэша, отправленного при отправке формы, у меня есть

Parameters: {"utf8"=>"✓", "commit"=>"Create Album", "user_id"=>"1", "authenticity_token"=>"XNCPLYWQRzjpuQfjqbR7XuhMjr5iRzjLiqXpqZ4spFo=", "album"=>{"event"=>"title"=>"My Title"}}

И SQL-запрос не использует значение user_id из хэша параметра

SQL (3.4 ms) вставить в" albums "("title"," user_id") значения (?, ?) [["title", "My Title"], ["user_id", nil]]

Я попытался добавить hidden_field в мою форму с user_id, но затем я получаю эту ошибку

Can't mass-assign protected attributes: user_id

Может ли кто-нибудь объяснить мне, что не так с моими моделями и моим ассоциация? Спасибо!

2 3

2 ответа:

  1. используйте множественное число для ассоциаций has_many
  2. Создайте альбом непосредственно в альбомах пользователя

    @album = @user.album.create(params[:album])
    

User_id не является частью альбома-субхэша хэша params, поэтому нет возможности, что пользователь будет добавлен, когда альбом будет сохранен.

Простое решение таково:

def create
    @user = User.find(params[:user_id])
    @album = @user.album.build(params[:album])  
    @album.save
end