Я не знаю, насколько это условно, но я бы так и сделал. я
добавит еще одно действие, если оно конкретно связано с этим
ресурс. В вашем примере show является находкой по идентификатору пользователя, поэтому имеет смысл
другое действие на UsersController. Вы можете превратить его в предложение, которое делает
смысл, "дай мне пользователя с этим адресом электронной почты"
Для другого, GET /users?username=joe&password=mysterio
, я бы сделал
это как другой ресурс. Я предполагаю, что вы думаете, что действие войдет в систему
пользователь, если пароль был правильным. Глагол GET не имеет смысла в этом
контекст.
Вы, вероятно, хотите ресурс 'сеанса' (кстати, именно так работает restful_auth).
Поэтому вы можете сказать «создайте мне сеанс для этого пользователя» или что-то вроде POST
/sessions
, где тело сообщения - это имя пользователя и пароль для пользователя.
Это также имеет хороший побочный эффект - не сохранять пароль в истории.
или позволить кому-то перехватить его на HTTP-прокси.
Итак, код вашего контроллера будет выглядеть примерно так:
class UsersController < ActionController::Base
def show
@user = User.find_by_id(params[:id])
# etc ...
end
def show_by_email
@user = User.find_by_email(params[:email)
end
end
class SessionsController < ActionController::Base
def create
# ... validate user credentials, set a cookie or somehow track that the
# user is logged in to be able to authenticate in other controllers
end
end
Вы бы настроили свои маршруты так:
map.connect "/users/byemail", :controller => "users", :action => "show_by_email", :conditions => { :method => :get }
map.resources :users
map.resources :sessions
Это даст вам URL, такие как /users/byemail?email=foo@example.com
. Есть
проблемы с кодировкой электронной почты непосредственно в пути URL, rails видит «.com»
в конце и по умолчанию переводит это в формат:. Там, вероятно,
Обходной путь, но это то, над чем я работал.
Также, как говорит Клэтус, есть способы, чтобы ваш маршрут соответствовал на основе формата частей URL, например, всех цифр или буквенно-цифровых символов, но я не знаю, как сделать так, чтобы это работало с точками в URL.