acts_as_authenticatedプラグインを導入し、ユーザーのモデルに1対多の関係を張りました。
class User < ActiveRecord::Base
has_many :portfolios
(省略)
end
class Portfolio < ActiveRecord::Base
belongs_to :user
end
Userを通してPortfolioを登録すると外部キー:user_idは自動的に設定されると参考書に書いてありました。
current_user.portfolios.create(params[:portfolio]) とすると:user_idに値が入っているのですが、
@portfolio = current_user.portfolios.new(params[:portfolio])
@portfolio.save とすると:user_idに値が入っていないようでエラーになります。
なぜcreateメソッドを使用すると:user_idの値が設定され、new⇒saveメソッドを使用すると:user_idの値が設定されないのでしょうか?
どちらも(params[:portfolio])で入力フォームの値を取得しているので、片方がエラーになる理由が良く分かりませんでした。
入力フォームには:user_idの値を入力する欄を設けてありません。
また、current_userのコードは以下になっているようです。
def current_user
03. @current_user ||= (session[:user] && User.find_by_id(session[:user])) || :false
04.end
コメント(2件)
new は「xxを使うよ」という宣言みたいなもので、
これだけでは中身は埋まらない。
create は「作れ」という具体的な指示なので、
中身は適宜埋められる。
手元にある環境がrails2.3.4なんで環境が違うと何とも言えませんが、親子関係の子からnewしてもcreateしても問題なくsaveできます。(acts as authenticatedは使わず、単純にactiverecordのリレーションを確認しました)
以下試した事です。
model Book
belongs_to :user
column title:string, user_id:integer
model User
has_many :books
column name:string
※データは適宜seedsで登録済み。
ruby script/consoleで
user = User.Find(1)
book = user.books.new(:title => "hogehoge")
※ここでuser_idはちゃんと値が入っています。
book.save
book = user.books.create(:title => "hogehoge")
※new->saveと同じ結果です。
とすると、ActiveRecordの特定のバージョンの問題か、acts as authenticatedの問題かということになりそうなきがします。
acts as authenticated使わないリレーションで問題ないか確認してみて、問題があるようであればActiveRecordのソース見る。逆に問題なしだったらacts as authenticatedのソース見るしかなさそうな予感。
あともしRails2.X系使ってるんだったらrestful authentication使ったほうが良いと思います