Нахождение объектов с двумя параметрами - PullRequest
0 голосов
/ 15 декабря 2011

Я работаю над проектом простого рельса, и я хотел бы знать, могу ли я найти объект с двумя различными параметрами, такими как

def show
@user = User.find_by_name(params[:name])
or 
@user = User.find_by_id(params[:id])
end 

В этом случае я хочу иметь возможность находить пользователей либо по их идентификатору, либо по их имени, чтобы при вводе URL-адреса, например localhost: 3000 / users / mike, переходил на страницу показа пользователей, когда я набираю localhost: 3000 / users / 4, он также выводит меня на страницу отображения тех же пользователей. Пожалуйста, как это можно сделать, если это возможно в рельсах.

1 Ответ

2 голосов
/ 15 декабря 2011

Я бы определил специальный метод поиска в вашей пользовательской модели, который мог бы выглядеть примерно так:

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, когда ему действительно было дано имя пользователя. Но это может быть обработано проверками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...