【问题标题】:How can I disable pre-fill form fields in Rails?如何禁用 Rails 中的预填表单字段?
【发布时间】:2015-12-23 08:46:00
【问题描述】:

我正在使用 Rails 制作待办事项列表。因此我制作了一个用户模型(电子邮件和密码)。我希望用户能够在那里编辑帐户,所以我在用户控制器上进行了编辑和更新操作,我也有一个用户模型。一切都很好,但我的问题是,在设置视图中,用于更新电子邮件的 text_field 已经预先填充了模型中的当前电子邮件地址。由于设计方面的原因,我想禁用预填充(占位符的内容应该立即可读)。我知道当我解决这个问题时,用户模型会出现另一个问题。例如,如果用户只想更改密码,用户将收到一条错误消息,例如:“电子邮件不能为空”和“电子邮件无效”......我能够修改密码的最小长度验证如果密码为空,因为我知道“has_secure_password”在对象创建时强制执行存在验证。所以我知道新用户将无法使用空白密码进行注册。但是如何为电子邮件验证创建相同的效果?我还没有找到解决方案,如果有人可以帮助我,我将不胜感激。提前致谢!

问题:

  1. 如何在 Rails 中禁用预填表单?
  2. 应该修改什么以在设置表单中接受空白电子邮件 没有在数据库中将电子邮件更新为空白?

users_controller.rb(控制器)

def edit
 @user = User.find(params[:id])
end

def update 
 @user = User.find(params[:id])
 if @user.update_attributes(user_params)
  flash[:success] = "Profile updated!"
  redirect_to @user
 else
  render 'edit'
 end
end

edit.html.erb(视图)

<% provide(:title, "Settings") %>
<h4>SETTINGS</h4>

<h5>User Edit</h5>
<%= @user.email %>
<div class="settings">
 <%= form_for(@user) do |f| %>
  <%= render 'layouts/error_messages' %>

  <p>Change Email:</p>
  <%= f.text_field :email, placeholder: "New Email", class: "formfield" %>

  <p>Change Password:</p>
  <%= f.password_field :password, placeholder: "New Password", class: "formfield" %>
  <%= f.password_field :password_confirmation, placeholder: "New Password Confirmation", class: "formfield" %>


  <%= f.submit "Save Changes", class: "form_button" %>
 <% end %>

 <%= link_to "Delete my Account", '#' %>
</div>

user.rb(模型)

class User < ActiveRecord::Base
 before_save { self.email = email.downcase }
 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
 validates :email, presence: true, length: { maximum: 255 },
                     format: { with: VALID_EMAIL_REGEX },
                 uniqueness: { case_sensitive: false }
 has_secure_password
 validates :password, length: { minimum: 6 }, allow_blank: true

 # Returns the hash digest of the given string.
 def User.digest(string)
  cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                BCrypt::Engine.cost
  BCrypt::Password.create(string, cost: cost)
 end
end

【问题讨论】:

  • 当您使用 form_for 时,它将绑定并在视图中显示模型值..

标签: ruby-on-rails forms email


【解决方案1】:

如何在 Rails 中禁用预填表单?

为您要禁用预填充的field 添加value: nil 即可。

例如,

<%= f.text_field :email, value: nil, placeholder: "New Email", class: "formfield" %>

应该修改什么以在设置表单中接受空白电子邮件 没有在数据库中将电子邮件更新为空白?

电子邮件验证中删除presence: true

validates :email, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }

【讨论】:

  • 允许空白将允许将 nil 保存到电子邮件数据库中,不是吗?
  • @japed 有点困惑,:allow_blank 也被 presence 验证器忽略。已更新。
  • 但我认为他想要这样,如果他们有一封电子邮件,它不会显示在表单中,但如果他们不输入任何内容,那么它将保持不变。允许空白会将其在数据库中设置为零,不是吗?我可能是错的......
  • 感谢值:nil 禁用了预填充!但是,当我删除出席时:真正的电子邮件验证时,由于 REGEX 电子邮件验证,我仍然会收到一条错误消息……如果我要删除它,我显然不会有任何注册验证!所以我知道“:allow_blank”会跳过设置中的错误消息,但它也会将电子邮件保存/更新为数据库中的空白:/我想要一个没有预填充的表单,如果他们不输入任何内容,它仍然会保留数据库中的相同电子邮件没有更新为空白...
【解决方案2】:

更新 您必须首次在编辑表单中添加带有value=nil 的属性,以保持占位符显示。

<%= f.text_field :email, value: nil, placeholder: "New Email", class: "formfield" %>

然后,为了避免在您的模型中进行验证,您可以在验证之前在控制器中添加价值电子邮件。例如:

def update 
  @user = User.find(params[:id])
  user_params[:email] = @user.email if params[:user][:email].nil?
  if @user.update_attributes(user_params)
    flash[:success] = "Profile updated!"
    redirect_to @user
  else
    render 'edit'
  end
end

希望对你有帮助

【讨论】:

  • 对不起,我回复得这么晚了,但我一直在度假......感谢您的帮助,但它没有工作,验证也不允许这样做:/
  • 这些是错误:“表单包含 2 个错误。电子邮件不能为空 电子邮件无效”。这是因为用户模型验证并且注册过程是必要的,否则人们可以在没有有效电子邮件地址的情况下注册......我不知道如何修改模型以允许用户设置中的这种期望......如果您不知道答案,但您知道一本书或任何可以找到答案的资源,我会很高兴!提前致谢!
【解决方案3】:

只需使用 form_tag,而不是 form_for

像这样 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

要在验证中允许空白电子邮件,请添加 allow_blank: true

validates :email, length: { maximum: 255 },
          format: { with: VALID_EMAIL_REGEX },
          uniqueness: { case_sensitive: false },
          allow_blank: true

http://edgeguides.rubyonrails.org/active_record_validations.html#allow-blank 同时验证存在和allow_blank 没有意义。

【讨论】:

  • 您的解决方案将数据库中的电子邮件更新为空白,用户可以使用空白电子邮件进行注册...这不是目标,但感谢您的尝试。注册应使用电子邮件验证,用户不应使用空白电子邮件进行注册。如果电子邮件表单为空,则用户设置中存在异常,则电子邮件应保持不变而不更新为空白,否则如果在电子邮件表单中输入了某些内容,则验证应再次起作用。感谢 Pavan,我知道如何禁用预填充。只需在表单中提供 nil 值即可禁用预填充。
【解决方案4】:

1 - 可能不是您正在寻找的解决方案,但您可以使用 javascript 清除该字段。

2 - 您可以使用来自rails docs 的条件验证:

class Order < ActiveRecord::Base
  validates :email, presence: true, unless: :email_present?

  def email_present?
    self.email.blank?
  end
end

代码未经测试,但必须接近可行的解决方案。

【讨论】:

  • 不是真的,因为它还允许在注册视图上进行空白注册! :(我想要一个没有预填充的表单,如果用户不输入任何内容,那么它在数据库中仍然保持不变而不更新为空白......这应该是一种期望,并且只能在用户设置上实现......我想我可以通过更新前的 before_validation 调用来做到这一点,只是在验证开始之前将电子邮件重置为存储的值,但我不知道如何仅在用户设置视图上完成此操作......:/谢谢试一试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2011-02-18
  • 2015-02-10
  • 2021-08-05
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多