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

jum4pzuy  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(314)

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

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 }

当然知道这有很多问题,希望能得到一些帮助。
谢谢!

gxwragnw

gxwragnw1#

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

validates: email, uniqueness: true

通过在联系人模型中添加验证,update方法将返回 false 所以邮件不会被更新。也可以通过添加 case_sensitive: false 进行验证。请记住,如果您有多个服务器/服务器进程(例如,运行phusion passenger、多个mongrel等)或多线程服务器,则此验证不能保证唯一性。请检查这个答案以获得进一步的解释。
但是,这对上面粘贴的代码不起作用,让我解释一下原因:
1) update方法需要传递1个参数,因此代码将抛出 ArgumentError 在那里。
2) render 在同一方法中出现多次:这将引发以下错误
在此操作中多次调用渲染和/或重定向。请注意,您只能调用render或redirect,每个操作最多只能调用一次。另外请注意,重定向和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

希望有帮助。

相关问题