需要检查电子邮件是否存在,然后更新记录。导轨

时间:2018-05-25 21:07:24

标签: mysql ruby-on-rails ruby activerecord

我只是想根据电子邮件地址是否存在来更新记录的某些属性。

控制器:

def update
    @contact = Contact.new(contact_params)

        if @contact.update then
            redirect_to :root, notice: 'yes was successfully updated.'
            else
            render "new"
            end
        render "show"
    end

型号:

class Contact < ApplicationRecord
has_attached_file :image, styles: {large: "600x600>", medium: "300x300>", thumb: "150x150#"}
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
    #validates :email, uniqueness: true
    validates :email, presence: true
end }

绝对知道这有很多错误,并希望得到一些帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

当然,这里有很多事情需要改进,首先让我明确回答你的问题:

validates: email, uniqueness: true 

通过在联系人模型中添加该验证,更新方法将返回false,因此不会更新电子邮件。您还可以通过向验证添加case_sensitive: false来忽略case_sensitivity。 您应该记住,如果您有多个服务器/服务器进程(例如,运行Phusion Passenger,多个Mongrels等)或多线程服务器,则此验证不保证唯一性。请查看this answer以获取详细说明。

但是,这对您上面粘贴的代码无效,请让我解释原因:

1)更新方法需要传递1个参数,因此您的代码将在那里抛出ArgumentError

2)render在同一方法中出现多次:这会引发以下错误

  

在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,每次操作最多一次。另请注意,重定向和渲染都不会终止操作的执行,因此如果要在重定向后退出操作,则需要执行类似&#34; redirect_to(...)之类的操作并返回&#34;。

您需要在那里重构代码。

对于redirect_to: root,请确保先配置为root route。

3)此行Contact.new(contact_params)不返回现有记录。新方法创建了一个对象实例,因此您不会在那里更新任何内容。

您方法的可能解决方案可能是:

helper_method :contact

def update
  if contact.update(contact_params)
    flash[:success] = "Contact updated"
    redirect_to :root
  else
    render :edit
  end   
end

private

def contact
  @contact ||= Contact.find(params[:id])
end

希望它有所帮助。