基本上我有一个应用程序(使用设计),用户只需使用电子邮件和密码注册 registrations#new
;这将注册并创建用户。它会立即将他们带到 registrations#edit
,在那里他们输入其余信息。
我正在使用带有 friendly_id 的 :name
属性作为个性化 url。此属性有 3 个要求:
- 必须一次性写入,写入后不可更改。
- 它不能是任何 Controller 名称(否则会破坏应用程序)。
- 它是独一无二的
对于#2 所以我在我的模型中添加了以下验证: `
validates :name, :exclusion => { :in => %w(
admin cars registrations users
), :message => "Sorry \"%{value}\" is taken!"}`
#3
我加了
validates_uniqueness_of :name
对于#1 我在 registrations#edit 下有以下观点:
<% if @user.name.blank?%>
<br>
<h2>Choose your username</h2>
<%= f.input :name, :value => "Username" , required: true, autofocus: true, label:false, class: 'usernameinputc' %>
<br>
如果它不存在,这会有效地向用户隐藏它。我遇到的问题是,如果他们输入一个 Controller 名称作为他们的 :name
或已经使用的东西,它将给出一个设计错误,并将它们发回但该字段将被隐藏。如果我删除条件然后它允许他们更改他们的 :name
即使它是有效的?我怎样才能使它仅在名称属性尚未保存时显示?
注意:我尝试了 if @user.name.persisted?
它给了我 nilClass 的无方法错误(我想是因为 :name
不存在。
更新
所以我尝试将其添加为虚拟属性,我已将字段 :username 添加到我允许的参数中作为虚拟属性。使用 getter 和 setter 方法有点麻烦。我试过这个:
def username
self.name if self.name.persisted?
end
我仍然收到无方法错误。
最佳答案
如果你试试这个怎么办?这将根据黑名单验证您的名字,但也会在发生这种情况时将 user.name 设置为空白。这样您的 erb 仍将正确呈现。
validate do |user|
if %w(admin cars registrations users).include?(user.name)
user.errors[:name] << "Sorry \"" + user.name + "\" is taken!"
user.name = ""
end
end
关于ruby-on-rails - FriendlyID Controller 名称验证包含问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31911468/