在设计

时间:2015-06-11 23:17:10

标签: ruby-on-rails ruby devise

我试图让我的应用自动生成用作网址的用户名。通常它们将是用户的名字和姓氏一起添加,但是当已经存在具有相同名字和姓氏的用户时,它会在每个名称增加一个数字。

这是我创建的方法:

def full_name
  first_name + ' ' + last_name
end

def user_name
  t_user_name = first_name.downcase.strip.gsub(' ', '').gsub(/[^\w-]/, '') + last_name.downcase.strip.gsub(' ', '').gsub(/[^\w-]/, '')
  user_name = t_user_name
  num = 1
  while User.find_by_user_name(user_name).count > 0
    num += 1
    user_name = "#{t_user_name}#{num}"
  end
end

我目前收到错误:

undefined method `find_by_user_name'

我认为自动会有效吗?

我也在尝试这篇文章中显示的例子:

generate unique username (omniauth + devise)

但我一直收到错误:

Mysql2::Error: Unknown column 'users.login' in 'where clause': SELECT COUNT(*) FROM `users` WHERE `users`.`login` = 'bobweir'

即使我添加了

t.string :login,          null: false, default: ""

到用户表

edit2:schema.rb

ActiveRecord :: Schema.define(版本:20150611033237)做

create_table "users", force: :cascade do |t|
  t.string   "first_name",             limit: 255
  t.string   "last_name",              limit: 255
  t.string   "email",                  limit: 255, default: "", null: false
  t.string   "encrypted_password",     limit: 255, default: "", null: false
  t.string   "reset_password_token",   limit: 255
  t.datetime "reset_password_sent_at"
  t.datetime "remember_created_at"
  t.integer  "sign_in_count",          limit: 4,   default: 0,  null: false
  t.datetime "current_sign_in_at"
  t.datetime "last_sign_in_at"
  t.string   "current_sign_in_ip",     limit: 255
  t.string   "last_sign_in_ip",        limit: 255
  t.datetime "created_at",                                      null: false
  t.datetime "updated_at",                                      null: false
end

add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree

1 个答案:

答案 0 :(得分:1)

Rails通过在方法调用中推断属性名称来实现 find_by_sth 魔法,从而返回ActiveRecordRelation。

由于模型中没有 user_name 属性,Active Record将无法对其执行搜索(只是想象它必须转换为SQL查询)。

另一方面,如果我是你,我会重新考虑 user_name 方法的逻辑。请考虑在数据库上保留user_name。

顺便提一下,在你提到的第二个错误中,请注意你所拥有的示例是使用 login 属性,而你根本就没有这个属性。