Я бы определил специальный метод поиска в вашей пользовательской модели, который мог бы выглядеть примерно так:
class User < ActiveRecord::Base
def self.find_by_id_or_name(arg)
# Checks to see if the supplied argument is numerical i.e. an id, not name
if arg.match(/^[0-9]+$/)
# send argument to default find method that looks up by id
User.find(arg)
else
# send argument to find_by_name! to look up record by name instead.
# The added ! makes sure that if no record is found, an RecordNotFound error is raised
User.find_by_name!(arg)
end
end
end
Тогда вы можете использовать этот метод в вашем контроллере следующим образом:
def show
@user = User.find_by_id_or_name(params[:id])
end
Edit:
Кроме того, чтобы это было отказоустойчивым, вы, вероятно, должны убедиться, что имя пользователя не может состоять только из цифр, чтобы оно не использовало find
параметром id, когда ему действительно было дано имя пользователя. Но это может быть обработано проверками.