外键(class_id)未在belongs_to关联中填充

我是rails的新手,并在rails3(beta4)上构建了一个小型测试应用程序。

我使用Authlogic来管理用户会话( 根据本教程以标准方式设置)

我有脚手架和设置卡模型(基本上是一个post),并为belongs_tohas_many关系设置基本的活动记录关联

user.rb

 has_many :cards 

card.rb

 belongs_to :user 

我将我的外键列添加到我的卡表: user_id ,默认为1

一切都很有效 。 我已经完成了我的观点,我可以看到关联,卡可以属于各种用户,这一切都很棒。

但是在创建新卡时,我似乎无法抓住当前的活跃用户

cards_controller.rb

 def new @card = Card.new @card.user = current_user respond_to do |format| format.html # new.html.erb format.xml { render :xml => @card } end end 

current_user在应用程序控制器中定义, 可在此处查看

user_id传递NULL并且没有任何内容写入数据库user_id列,使其默认为1而不是实际登录用户的ID。

我尝试过像@user = current_user这样的显而易见的事情

它可能是非常简单的东西,但今天是我第一次使用rails的真实日子 – 谢谢!

现在,当您在new操作上设置用户时,它会显示,但不会在create操作上设置。

我看到2个选项,后者更好:

  1. 如果您继续在new操作中离开@card.user = current_user ,则可以设置隐藏的输入字段card[user_id] ,其中可以包含当前用户的ID。 这是一个非常糟糕的主意,因为任何人都可以将他们想要的东西扔到那个领域。

  2. 尝试在create操作中的@card.save行之前移动@card.user = current_user 。 通过这种方式,用户无法使用它,并且当它实际即将被保存时,它会将其设置为卡对象。

常见的Rails习惯用法(在RESTful控制器中)是在新操作中创建卡的实例(@card),向浏览器呈现视图,然后在创建操作中将此对象保存到数据库中(假设您有一些中间件)在这些操作之间从用户捕获额外的卡详细信息)。 您可以使用Rails关联以正确的用户正确构建卡实例。 Rails 3引入了简化的响应器设施,如此处所示。

 respond_to :html, :xml def new respond_with(@card = current_user.cards.build) end def create @card = current_user.cards.new(params[:card]) if @card.save respond_with(@card) else // Do something else to handle the error case.... end end