Rails检查已存在用户的数据库并添加注释而不创建新用户

时间:2013-06-23 02:54:56

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

我有房东和评论课。 房东有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时抛出错误。 会导致什么?我已经在终端尝试了它,虽然我使用的是硬编码值,但它工作正常。

1 个答案:

答案 0 :(得分:0)

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

@landlord = Landlord.where(params[:landlord]).first_or_create!
@landlord.comments.build
# etc ...