ruby-on-rails - FriendlyID Controller 名称验证包含问题

标签 ruby-on-rails ruby devise friendly-id write-once

基本上我有一个应用程序(使用设计),用户只需使用电子邮件和密码注册 registrations#new;这将注册并创建用户。它会立即将他们带到 registrations#edit,在那里他们输入其余信息。

我正在使用带有 friendly_id 的 :name 属性作为个性化 url。此属性有 3 个要求:

  1. 必须一次性写入,写入后不可更改。
  2. 它不能是任何 Controller 名称(否则会破坏应用程序)。
  3. 它是独一无二的

对于#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/

相关文章:

ruby-on-rails - 从 rails api 在 tableview 中显示用户设置

ruby-on-rails - 当前最好的 Rails 后台任务方法?

ruby - 安装了两个版本的 Ruby。删除了旧的并以某种方式卡住了

ruby-on-rails - 如何在 Rails、Devise 和 Backbone.js 中使用 token 身份验证?

ruby-on-rails - Rails 5 使用已在 PostgreSQL 中创建的用户表生成设计

ruby-on-rails - View 中缺少第一个字段

ruby-on-rails - ruby 排序数组的数组

Ruby:将常量转换为字符串

ruby-on-rails - 两个日期之间的小时数 - Ruby

ruby-on-rails - ActiveModel::ForbiddenAttributesError 使用设备进行注册时