我试图让我的应用自动生成用作网址的用户名。通常它们将是用户的名字和姓氏一起添加,但是当已经存在具有相同名字和姓氏的用户时,它会在每个名称增加一个数字。
这是我创建的方法:
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
端
答案 0 :(得分:1)
Rails通过在方法调用中推断属性名称来实现 find_by_sth 魔法,从而返回ActiveRecordRelation。
由于模型中没有 user_name 属性,Active Record将无法对其执行搜索(只是想象它必须转换为SQL查询)。
另一方面,如果我是你,我会重新考虑 user_name 方法的逻辑。请考虑在数据库上保留user_name。
顺便提一下,在你提到的第二个错误中,请注意你所拥有的示例是使用 login 属性,而你根本就没有这个属性。