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