Я не уверен, что мне не хватает известного шаблона проектирования, но я продолжаю сталкиваться со следующей проблемой с RESTful-маршрутами Rails.
В моем примере у меня есть контроллер пользователя, который может отвечать в формате javascript (: js). Ответ по умолчанию заполняет элемент страницы списком разбитых на страницы пользователей:
# /app/controllers/users_controller.rb
class UsersController < ActionController
def index
@users = User.paginate(:all, :page => params[:page], :conditions => ['name ILIKE ?', params[:name])
respond_to do |format|
format.html
format.js
end
end
end
Соответствующий шаблон RJS будет выглядеть так:
# /app/views/users/index.js.rjs
page.replace_html :users, :partial => 'users'
Это прекрасно работает, что позволяет мне выполнять поиск AJAX для пользователей. Однако в другой части моего сайта (скажем, в форме редактирования пользователя) я хотел бы выполнить поиск пользователей в AJAX, но обновить набор параметров «select» или выполнить встроенное автозаполнение вместо обновления страницы #users. элемент, например
# /app/views/users/edit.html.erb
<%= f.text_field :name %>
$('#user_name').autocomplete({url: '/users', data: 'name=value', ...})
Мой вопрос: каков наилучший СУХОЙ способ добиться этого? Я не думаю, что мне нужно создавать новое действие контроллера, чтобы соответствовать другому представлению, так как это потребовало бы повторения кода поиска. Единственное решение, с которым я сталкивался до сих пор, - это встроить некоторые условия javascript в мой помощник RJS:
# /app/views/users/index.js.rjs
page << "if($('#users').length > 0)"
page.replace_html :users, :partial => 'users'
page << "else"
page.replace_html :user_options, :partial => 'user_options_for_select'
Это кажется очень хрупким и нечистым для Рельсов. Я что-то упускаю из-за того, как я могу ответить разными взглядами в зависимости от вызывающего контроллера?
Ценю любую помощь!
Chris