首页 > 解决方案 > 需要检查电子邮件是否存在,如果存在则更新记录。导轨

问题描述

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

控制器:

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 }

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

谢谢!

标签: mysqlruby-on-railsrubyactiverecord

解决方案


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

validates: email, uniqueness: true 

通过在您的联系模型中添加该验证,更新方法将返回false,因此电子邮件不会被更新。您还可以通过添加case_sensitive: false到验证来忽略 case_sensitive。您应该记住,如果您有多个服务器/服务器进程(例如运行 Phusion Passenger、多个 Mongrel 等)或多线程服务器,则此验证不能保证唯一性。请检查此答案以获取扩展说明。

但是,这不适用于您上面粘贴的代码,让我解释一下原因:

1) update 方法需要传递 1 个参数,所以你的代码会在ArgumentError那里抛出一个。

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

在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,并且每个操作最多调用一次。另请注意,重定向和渲染都不会终止操作的执行,因此如果您想在重定向后退出操作,则需要执行“redirect_to(...) and return”之类的操作。

您将需要在那里重构您的代码。

对于redirect_to: root,请确保首先配置为根路由。

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

希望能帮助到你。


推荐阅读