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