Ruby on Rails:如何验证是否在特定页面上?
Ruby on Rails: How to validate if on specific page?
在我的 Ruby on Rails 应用程序中,我尝试添加验证以确保用户已在文本框中输入值。在我的系统中,我有一个名为 Account
的 table,它存储用户的电子邮件帐户信息,当他们进入 views/accounts/_form.html.erb
页面添加新电子邮件帐户时,我想验证是否存在端口号。我可以通过以下代码做到这一点:
validates :port, presence: true
这成功地确保了用户输入他们的端口号,但是当用户通过 views/users/_new.html.erb
页面注册时,他们只需要输入一个电子邮件地址(例如 example@example.com)和 users_controller
将在 Account
table 中为此电子邮件地址创建一条记录。我的问题是,在 views/accounts/_form.html.erb
页面上需要端口号,但在 views/users/_new.html.erb
页面上则不需要。
如果用户在 views/accounts/_form.html.erb
页面或调用 accounts_controller
中的 create
方法,是否有验证用户输入端口号的方法?
我知道我可以像这样通过 HTML 所需的验证来做到这一点:<%= f.text_field :port, :required => true %>
但我需要添加进一步的验证以及存在,所以这不是 suitable.
您可以创建一个 attr_accessor
字段来确定是否应该进行验证...
class Account < ActiveRecord:Base
attr_accessor :port_needs_validation
validates :port, presence: true, if: -> {port_needs_validation}
然后只需在创建方法中设置访问器...
def create
@account = Account.new
@account.assign_attributes(account_params)
@account.port_needs_validation = true
if @account.save
...
将那部分逻辑提取到表单对象中,查看 legendary 2012 blog entry from CodeClimate。从那以后事情发生了变化,作者使用 Virtus
构建表单对象,这些天更流行和 up-to-date gems 是:
如果这是 one-off 的事情,那就去做 但这肯定会导致地狱,safe-hate 和离婚(至少从个人经验来看) 稍微小一点 更大的项目(即你打算多花几个小时在上面,这不像你刚刚完成所有事情就想回家)。
实际上,只需在所有地方使用表单 类 并完全避免模型验证和其他回调。您不希望在编写测试时发送帐户激活邮件或验证密码的复杂性,而只需要属于 "user".
的 "post"
由于 account_type
属性迁移中无辜的拼写更改更新,由于模型回调,我自己最喜欢的个人错误是发送了 240.000 封 "your account has been upgraded/downgraded" 电子邮件,仅仅因为 account_type_changed?
是真的。
所以.. 永远形成 类,模型回调永远不会。
我不建议您 model
知道 views
。 @SteveTurczyn 的方案,在model中引入一个抽象字段来标识它来自哪个页面,这是一个很好的方案。
从 Ruby on Rail MVC 开始,View
和 Model
都与控制器通信,另一个解决方案是让控制器句柄 validation 参数在传递值之前创建 account
.
在我的 Ruby on Rails 应用程序中,我尝试添加验证以确保用户已在文本框中输入值。在我的系统中,我有一个名为 Account
的 table,它存储用户的电子邮件帐户信息,当他们进入 views/accounts/_form.html.erb
页面添加新电子邮件帐户时,我想验证是否存在端口号。我可以通过以下代码做到这一点:
validates :port, presence: true
这成功地确保了用户输入他们的端口号,但是当用户通过 views/users/_new.html.erb
页面注册时,他们只需要输入一个电子邮件地址(例如 example@example.com)和 users_controller
将在 Account
table 中为此电子邮件地址创建一条记录。我的问题是,在 views/accounts/_form.html.erb
页面上需要端口号,但在 views/users/_new.html.erb
页面上则不需要。
如果用户在 views/accounts/_form.html.erb
页面或调用 accounts_controller
中的 create
方法,是否有验证用户输入端口号的方法?
我知道我可以像这样通过 HTML 所需的验证来做到这一点:<%= f.text_field :port, :required => true %>
但我需要添加进一步的验证以及存在,所以这不是 suitable.
您可以创建一个 attr_accessor
字段来确定是否应该进行验证...
class Account < ActiveRecord:Base
attr_accessor :port_needs_validation
validates :port, presence: true, if: -> {port_needs_validation}
然后只需在创建方法中设置访问器...
def create
@account = Account.new
@account.assign_attributes(account_params)
@account.port_needs_validation = true
if @account.save
...
将那部分逻辑提取到表单对象中,查看 legendary 2012 blog entry from CodeClimate。从那以后事情发生了变化,作者使用 Virtus
构建表单对象,这些天更流行和 up-to-date gems 是:
如果这是 one-off 的事情,那就去做
实际上,只需在所有地方使用表单 类 并完全避免模型验证和其他回调。您不希望在编写测试时发送帐户激活邮件或验证密码的复杂性,而只需要属于 "user".
的 "post"由于 account_type
属性迁移中无辜的拼写更改更新,由于模型回调,我自己最喜欢的个人错误是发送了 240.000 封 "your account has been upgraded/downgraded" 电子邮件,仅仅因为 account_type_changed?
是真的。
所以.. 永远形成 类,模型回调永远不会。
我不建议您 model
知道 views
。 @SteveTurczyn 的方案,在model中引入一个抽象字段来标识它来自哪个页面,这是一个很好的方案。
从 Ruby on Rail MVC 开始,View
和 Model
都与控制器通信,另一个解决方案是让控制器句柄 validation 参数在传递值之前创建 account
.