СУШКА маршрутов и ответов JavaScript - PullRequest
1 голос
/ 05 октября 2009

Я не уверен, что мне не хватает известного шаблона проектирования, но я продолжаю сталкиваться со следующей проблемой с 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

1 Ответ

0 голосов
/ 05 октября 2009

В одном из них у вас есть список пользователей, а в другом - список параметров.
Поэтому, хотя на данный момент ваши две страницы имеют одну и ту же функцию, они независимы друг от друга, и в будущем вам может понадобиться изменить только одну из них.

Так что я бы выделил их с помощью двух разных действий javascript. Это позволит вам гораздо легче заставить их эволюционировать на своем другом пути.

В любом случае, как вы можете видеть, они уже совсем другие. У вас есть два разных партиала и два разных идентификатора HTML-тегов.
Попытка получить один и тот же код для них обоих кажется мне довольно запутанной.

Так что да, я бы создал два действия, одно для списка пользователей и одно для их параметров.

...