【问题标题】:Foreign key (class_id) not populating in belongs_to association外键 (class_id) 未填充到 belongs_to 关联中
【发布时间】:2011-03-08 21:39:25
【问题描述】:

我是 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。

我尝试了@user = current_user之类的明显的东西

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

【问题讨论】:

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


    【解决方案1】:

    现在,当您在new 操作上设置用户时,它会出现,而不是在create 操作上。

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

    1. 如果您继续在您的new 操作中保留@card.user = current_user,您可以设置一个隐藏的输入字段card[user_id],其中可以包含当前用户的ID。这是一个非常糟糕的主意,因为任何人都可以随心所欲地向该领域投入任何东西。

    2. 尝试在 create 操作中将 @card.user = current_user 移动到您的 @card.save 行之前。这样用户就不会乱用它了,它会在实际要保存的时候将它设置为你的卡片对象。

    【讨论】:

    • 完美,太明显了!作为框架的新手,我什至没有考虑到新操作实际上并没有保存卡片这一事实 :) 谢谢!
    【解决方案2】:

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

    【讨论】:

    • 对我来说,这是完成所要求的事情的更好方法。即使它早在 2010 年,但我还是会注意到这一点。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多