如何使用一对一关系关联模型

时间:2015-09-18 00:36:58

标签: ruby-on-rails

下面给出了两个与一对多关系相关的模型,它可以正常工作

class User < ActiveRecord::Base
  has_many :events, dependent: :destroy
end

但当我将它们一对一关联时

class User < ActiveRecord::Base
  has_one :event, dependent: :destroy
end

它给我以下错误

undefined method `build' for nil:NilClass

事件控制器

class EventsController < ApplicationController

  def new
    @event = current_user.event.build
  end

def create
    @event = current_user.event.build(event_params)

    if @event.save
        redirect_to @event
    else
          render 'new'
      end
  end

private

  def event_params
    params.require(:event).permit(:date, :time, :venue)
  end

end

2 个答案:

答案 0 :(得分:1)

它抛出错误的原因是因为该用户没有事件。虽然这是通过关联建立has_many关系的方式,但它不适用于has_one。请参阅documentation on has_one,他们说调用.build无效。

而是使用@event = current_user.create_event

添加has_one关系将为您提供以下方法:

  • association(force_reload = false)
  • association=(associate)
  • build_association(attributes = {})
  • create_association(attributes = {})
  • create_association!(attributes = {})

答案 1 :(得分:0)

对于has_one关联,Rails提供了一组特殊的方法来构建关联(http://geojson.org/geojson-spec.html#multipolygon

  • build_event
  • create_event

这两个属性都使用build关联的has_many方法。

在您的情况下,将current_user.event.build更改为current_user.build_event,将current_user.event.build(event_params)更改为current_user.build_event(event_params)