mysql - 需要检查电子邮件是否存在,如果存在则更新记录。导轨
问题描述
我只是想根据电子邮件地址是否存在来更新记录的某些属性。
控制器:
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 }
绝对知道这有很多问题,并希望得到一些帮助。
谢谢!
解决方案
当然,这里有很多地方需要改进,首先让我明确回答你的问题:
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
希望能帮助到你。
推荐阅读
- arduino - 适用于 ESP32 的 Max TX power 经典蓝牙
- google-cloud-platform - 谷歌云上用于 pihole 的 Icmp ping 和 dns 端口不起作用
- sql - SQL Count 和 distinct count(*) 通过对两列进行分组
- reactjs - 如何在reactjs中将数组显示为Jsx元素
- javascript - 为什么我在反应中得到第一个响应是一个空数组?
- google-cloud-platform - 验证 Google Cloud Platform 服务使用配额
- woocommerce - Woocommerce:创建变体 - 默认情况下检查管理库存
- visual-studio-code - 在 vscode 中调试静态网站的最简单方法是什么?
- javascript - 具有待定义属性的对象
- kubernetes - 无法查看 Pods CPU 和内存利用率,并且缺少图表 Kubernetes 仪表板