Рендеринг HTML и JSON в представлении Rails 3 для анализа с JQuery - PullRequest
1 голос
/ 22 декабря 2011

Предисловие: я новичок в Rails. Также немного нового в JQuery и JSON. Я в настоящее время рендеринга HTML из моего контроллера как таковой:

def new
  @customer = Customer.find(params[:id])
end

Я использую этот экземпляр @customer для установки полей формы. У меня также есть в этой форме два выбранных помощника:

<%= select(:customer, :billing_type_id, BillingType.all.map{ |lk| [lk.name, lk.id] })%>
<%= select(:customer, :account_id, Account.all.map{ |lk| [lk.number, lk.id] }) %>

Оба списка выбора привязаны к моей модели клиента. Модель BillingType принадлежит учетной записи. После выбора BillingType я хочу автоматически выбрать соответствующую учетную запись. Пользователь имеет право выбрать учетную запись, отличную от учетной записи по умолчанию, поэтому обе модели используются в модели Customer. Целью автоматического выбора учетной записи является исключительно удобство для пользователя.

Моей первой идеей было как-то вернуть BillingType.all.to_json как часть нового действия моего контроллера. Затем, если этот json доступен на клиенте, я могу проанализировать его и подключить событие изменения в JQuery, чтобы выбрать учетную запись по умолчанию при выборе BillingType.

Так что мой вопрос действительно состоит из двух частей:

  1. Каким образом можно выполнить настройку связанной опции выбора?

  2. Независимо от того, каков правильный путь для достижения моей цели, мне теперь любопытно, как одновременно вернуть json AND html из действия контроллера. Я действительно не думаю, что хочу сделать ajax-запрос из моего события загрузки документа, так как это потребует обратной передачи на сервер. Есть ли способ просто отобразить все типы BillingType для тега как json, чтобы я мог ссылаться на него с помощью JQuery и анализировать json? Я чувствую, что хочу сделать что-то вроде этого:

В jquery:

var obj = jQuery.parseJSON($("#billingtypes"));

В поле зрения:

<span id="billingtypes"><%= BillingType.all.to_json %></span>

Возможно, все это неправильно, но я буду очень признателен за понимание того, как справиться с моими двумя проблемами.

1 Ответ

0 голосов
/ 22 декабря 2011

Один из подходов действительно состоит в том, чтобы материализовать типы счетов на вашей странице.

что-то вроде

var billingTypes = <%= BillingType.all.to_json %>;

в теге script на вашей странице создаст переменную javascript с этимИнформация.Синтаксический анализ не требуется!

Другой подход заключается в добавлении атрибутов данных в теги параметров, т. Е. Измените свой тег выбора на

<%= select(:customer, :billing_type_id, BillingType.all.map{ |lk| [lk.name, lk.id, :'data-account-id' => lk.default_account_id] } %>

Я предполагаю, что ваши типы счетов имеют default_account_idметод / атрибут, который возвращает идентификатор учетной записи для использования.Я прикрепил идентификатор учетной записи для выбора отдельных тегов параметров, а затем вы можете сделать что-то вроде

$('#id_of_your_select').change(function(){
  var accountId = $(':selected', $(this)).data('account-id');
 // do something cool with accountId
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...