User Model 添加了 has_many :orders Order Model 添加了 belongs_to :user
生成了一个 migration,给 order 加入了 add_column :orders, :user_id, :integer
但是在生成 order 里没有 user_id 的数据。
有什么地方错了么?
上面的幾行是在定義表與表間的關係。真正哪一張 order 由哪一位用戶所產生,仍是需要你在 controller 中產生 oroder 實例時設定 (系統怎麼知道該訂單由誰下?)。設定方法很多種。
# orders#create
current_user.orders << order
或者
# 在 orders#new 中
@order = current_user.orders
# 並在表單中放入隱藏欄位,表單送出時才能得知是哪位用戶下的訂單
= f.hidden_field :user_id
# 如果是這樣,在 orders#create 中只要 Order.create!(params[:order]) 即可。
@ray, @hSATAC 说的 current_user 不是 rails 的默认机制,应该是 Devise 这个 gem 引入的。https://github.com/plataformatec/devise
關於 current_user 可參考 devise。
上面數據庫的設計及 model 間的關聯設定是對的。只缺在存入資料時,要寫入是誰下的訂單。這是意義問題,不是結構問題。如上所說,要讓 user_id 有值,方法很多。但總要有地方去放入那個值。
以上 5/6/7 樓是我寫的。(@hSATAC 不是我的帳號。我已去站上反饋提報這個問題。)
@ray 你能确定 在 create
or update
的时候 有 order.user
的指定 或者直接给定 order.user_id
吗
还有 你 Order.new
的时候 有 user_id
的字段吗 字段存在与否 实际上和 model
是没有必然关系的
#11 楼 @jhjguxin order.new 時,即使 @order 裡有 user_id 的值,但透過表單回傳時,若沒有加上該 user_id(一般皆設為隱藏),submit 的 params[:order] 裡仍然會沒有 user_id 字段。
由於 order 這類操作一般皆為當下用戶操作,所以其實可以在 orders#create 直接賦值就好。也就是
current_user.orders.crate(params[:order])
# 這行指令就是以 "User Model 添加了 has_many :orders" 的設定為前提
作的事。
這種方式另有一個安全上的優點:(對比於用 form 裡的 = f.hidden_field :user_id) 我們是否允許用戶任意指定訂單為他人所建?若不允許的話,直接取得 current_user (就是當下登入的帳號) 並用它產生訂單,那 user_id 就一定會是 current_user.id,而不能是別的。
https://github.com/huacnlee/ruby-china/blob/master/Gemfile
# 用户系统
gem 'devise', '1.5.2'
Ruby China 也是用 devise。
@ray 那是肯定要指定的 否则 系统怎么会知道你 要指定那个用户呢 那个 Gemfile 的问题 那是肯定要的 因为 rails 3.2 都是使用 bundle 那管理 扩展 gem 的了 而废弃 plugin 的方式了 而 bundle 的话一般是在 Gemfile 中指定的(也可以 gemspec)楼主还很缺 多多 看 demo 多多读文档吧