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

时间:2010-06-27 19:34:02

标签: ruby-on-rails ruby activerecord associations ruby-on-rails-3

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

我正在使用 Authlogic 来管理用户会话(以标准方式设置为per this tutorial

我已经搭建了支架并设置了一个卡片模型(基本上是一个帖子),并为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在应用程序控制器中定义,available to view here

user_id正在传递NULL,并且没有任何内容会写入数据库user_id列,而是默认为1,而不是实际登录用户的ID。< / p>

我尝试过像@user = current_user

这样的显而易见的事情

这可能是超级简单的东西,但今天是我第一次使用rails的真实日子 - 谢谢!

2 个答案:

答案 0 :(得分:6)

现在,当您在new操作上设置用户时出现,而create操作则没有。

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

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

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

答案 1 :(得分:3)

常见的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