0

我有一个房东和评论课。楼主有1:N评论。创建房东时,它会在同一表单(嵌套)上创建评论。

提交表单时,将调用 users_controller#create。

我想检查数据库是否已经存在具有相同名称、城市和州的房东,并将评论添加到该房东而不是创建新的。

def create      
#check if a landlord of the same name already exists and add comments to that


    if Landlord.find_by_name(params[:name]) && Landlord.find_by_city(params[:city])&& Landlord.find_by_province(params[:province])
     @landlord_exists = Landlord.find_by_name(params[:name]) && Landlord.find_by_city(params[:city])&& Landlord.find_by_province(params[:province])

     @landlord_exists.comments.build

     @landlord_exists.comments[0].setIP request.remote_ip

     @landlord_exists.save
    else 
      @landlord = Landlord.new(params[:landlord])
      @landlord.comments[0].setIP request.remote_ip
      if @landlord.save

       flash[:success] = "Thank you for submitting a Landlord"
       redirect_to landlords_path
      else

      end
    end
end

将#1 更新为

  def create    

    @landlord = Landlord.where(:name => params[:name], :city => params[:city], :province => params[:province]).first_or_create!

    @landlord.comments[0].setIP request.remote_ip


    if @landlord.save     
      redirect_to landlords_path
    else
    end

  end

线

@landlord = Landlord.where(:name => params[:name], :city => params[:city], :province => params[:province]).first_or_create!

似乎返回一个 nil 对象,因此在调用 setIP 时会引发错误。什么会导致这种情况?我已经在终端中尝试过了,虽然我使用的是硬编码值,但它运行良好。

4

1 回答 1

0

最简单的方法是使用 ActiveRecord::Relation 的first_or_create!方法。这将根据表单中输入的参数执行查询,如果没有找到匹配项,则创建一条记录,这意味着您可以获得if ... else条件:

@landlord = Landlord.where(params[:landlord]).first_or_create!
@landlord.comments.build
# etc ...
于 2013-06-23T03:09:41.807 回答