Mysql 需要检查电子邮件是否存在,如果存在,则更新记录。轨道

Mysql 需要检查电子邮件是否存在,如果存在,则更新记录。轨道,mysql,ruby-on-rails,ruby,activerecord,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

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

控制器:

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 }
class联系人”,medium:“300x300>”,thumb:“150x150#”}
验证附件内容类型:图像、内容类型:/\Aimage\/.\z/
#验证:电子邮件,唯一性:true
验证:电子邮件,状态:true
结束}
当然知道这有很多错误,希望能得到一些帮助


谢谢

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

validates: email, uniqueness: true 
通过在联系人模型中添加验证,更新方法将返回
false
,因此电子邮件将不会更新。您还可以通过向验证中添加
区分大小写:false
来忽略区分大小写。 请记住,如果您有多个服务器/服务器进程(例如运行Phusion Passenger、多个Mongrel等)或多线程服务器,则此验证不能保证唯一性。请查看详细解释

但是,这对上面粘贴的代码不起作用,让我解释一下原因:

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

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

在此操作中多次调用渲染和/或重定向。请注意,您只能调用render或redirect,每个操作最多只能调用一次。还请注意,重定向和渲染都不会终止操作的执行,因此,如果要在重定向后退出操作,则需要执行类似“重定向到(…)并返回”的操作

您需要在那里重构代码

对于
重定向到:root
,请确保首先配置为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

希望能有所帮助。

谢谢您的回复。当我进行上述编辑并实现您的解决方案时,我收到一个错误。找不到具有“id”的联系人=这是因为您没有具有指定id的记录,或者您没有通过param接收该记录。作为建议,我将创建一个base_控制器来捕获错误,并使此控制器从中继承。在这种情况下,您需要捕获的异常是
rescue\u from ActiveRecord::RecordNotFound