即使记录也存在,如何为.save()返回成功? - Rails 3.1

时间:2011-12-13 11:34:07

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

我正在尝试修改以下代码,以便在email存在时返回flash通知并成功。

class SubscribersController < ApplicationController
  respond_to :json

  def create
    @subscriber = Subscriber.new(:first_name     => params[:first_name],
                                 :last_name      => params[:last_name],
                                 :email          => params[:email],
                                 :ip_address     => request.remote_ip,
                                 :referring_page => request.referer )
    if @subscriber.save
      flash[:notice] = "You've been subscribed!"
    end

    respond_with(@subscriber)
  end

end

我如何检查电子邮件地址是否已存在并使用Flash消息返回成功?

如果电子邮件已经存在(模型需要检查),我不想抛出错误 - 我还想说你已经订阅了。

我已尝试使用.present?进行检查,但会引发错误:

<h1>
  NoMethodError
    in SubscribersController#create
</h1>
<pre>undefined method `model_name' for ActiveRecord::Relation:Class</pre>

2 个答案:

答案 0 :(得分:3)

我相信,你可以使用动态查找器。

@subscriber = Subscriber.find_or_initialize_by_email(params[:email], { :first_name => ..., })

但是,我认为,保存已保留的记录会返回false,因此您需要检查是否

@subscriber.persisted? or @subscriber.save
  flash[:success] = "You've been subscribed!"
end

答案 1 :(得分:2)

在订户模型中添加验证

validates_uniqueness_of :email

并在控制器中

@subscriber.valid?

if @subscriber.errors.on(:email) == "XXX"
   flash[:error] = "email address exists already"
end