我只是想根据电子邮件地址是否存在来更新记录的某些属性。
控制器:
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 }
绝对知道这有很多错误,并希望得到一些帮助。
谢谢!
答案 0 :(得分:1)
当然,这里有很多事情需要改进,首先让我明确回答你的问题:
validates: email, uniqueness: true
通过在联系人模型中添加该验证,更新方法将返回false
,因此不会更新电子邮件。您还可以通过向验证添加case_sensitive: false
来忽略case_sensitivity。
您应该记住,如果您有多个服务器/服务器进程(例如,运行Phusion Passenger,多个Mongrels等)或多线程服务器,则此验证不保证唯一性。请查看this answer以获取详细说明。
但是,这对您上面粘贴的代码无效,请让我解释原因:
1)更新方法需要传递1个参数,因此您的代码将在那里抛出ArgumentError
。
2)render
在同一方法中出现多次:这会引发以下错误
在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,每次操作最多一次。另请注意,重定向和渲染都不会终止操作的执行,因此如果要在重定向后退出操作,则需要执行类似&#34; redirect_to(...)之类的操作并返回&#34;。
您需要在那里重构代码。
对于redirect_to: root
,请确保先配置为root route。
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
希望它有所帮助。