has_xxxの関係を通して外部キーを自動で設定するには


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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/12/31 12:45:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答0件)

回答はまだありません

  • id:kn1967
    アバウトな説明しかできないのでコメント欄。

    new は「xxを使うよ」という宣言みたいなもので、
      これだけでは中身は埋まらない。
    create は「作れ」という具体的な指示なので、
      中身は適宜埋められる。
  • id:cuspos
    一度コメントをつけたのですが、ずれまくってたので削除しました。

    手元にある環境が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使ったほうが良いと思います

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません