Использование REST на месте с вложенными атрибутами - PullRequest
0 голосов
/ 17 июля 2011

REST in Place - это фантастический плагин rails от Jan Varwig, который использует AJAX для редактирования атрибутов объекта inline. Его было очень легко настроить, просто внедрить, и, как правило, он хорошо работает.

Я читал в Интернете людей, использующих REST на месте с вложенными атрибутами, но на самом деле я не нашел упоминаний о том, как это делается. Я не ожидал бы, что это будет слишком сложно, но я пока не смог понять это (хотя у меня не было проблем с не вложенными атрибутами).

У меня есть модель опроса:

class Survey < ActiveRecord::Base
  has_one :question, :dependent => destroy
  accepts_nested_attributes_for :question

  attr_accessible :description
  validates_presence_of :description
end

и соответствующая модель Вопроса:

class Question < ActiveRecord::Base
  belongs_to :survey

  attr_accessible :title, :contents
  validates_presence_of :title, :contents
end

Мои попытки привели к трем сценариям:

1. REST in Place реализован с использованием вложенных атрибутов - [works]

Код в представлении выглядит следующим образом:

<span class="rest_in_place" data-url="<%= url_for @survey %>" data-object="survey" data-attribute="description">
  <%= @survey.description %>
</span>

и это прекрасно работает. Когда вы щелкаете по описанию, появляется текстовое поле формы со старым значением внутри (из внутреннего HTML). Я могу отредактировать текст, и при нажатии «Enter» форма отправляет обновление AJAX и отображает новое значение с помощью jQuery. Здесь все хорошо.

2. REST in Place реализован с вложенными атрибутами - [не работает]

Код выглядит следующим образом (дайте мне знать, если что-то не так)

<span class="rest_in_place" data-url="<%= url_for @survey %>" data-object="survey" data-attribute="question_attributes[title]">
  <%= @survey.question.title %>
</span>

Здесь javascript, который загружает форму, работает нормально, но когда я пытаюсь отправить новое значение для обновления заголовка вопроса, я получаю сообщение об ошибке ActiveRecord::RecordInvalid (Validation failed: Question contents can't be blank, сообщающее, что либо он пытается создать новый вопрос (который не имеет смысла, так как запрос все еще идет к действию update в контроллере Survey) или сбрасывает оба значения.

3. Установка вложенного атрибута :update_only => true - [частично работает]

Итак, я решил, что если бы я мог предотвратить создание новых Вопросов, это могло бы сработать (даже если это не адекватное решение, поскольку мне нужно создавать новые вопросы для каждого нового опроса). Я изменил код модели Survey на следующий:

class Survey < ActiveRecord::Base
  has_one :question, :dependent => destroy
  accepts_nested_attributes_for :question, :update_only => true

  ...

end

А затем, что интересно, запрос AJAX работал нормально - когда я менял атрибут вопроса, он обновлялся в базе данных, но по какой-то причине он зависал при «сохранении…» и никогда не восстанавливал вновь обновленный атрибут. Перезагрузка страницы, конечно, хорошо отображает новый текст, но весь смысл использования AJAX состоит в том, чтобы предотвратить эту необходимость.


Это должно быть все. Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи относительно того, почему возникают какие-либо из этих проблем, и если у вас есть предложения по их устранению. Спасибо!

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Строка 84 из jquery.rest_in_place.js:

data += "&"+this.objectName+'['+this.attributeName+']='+encodeURIComponent(this.getValue());

Вы хотите, чтобы параметры, отправляемые на сервер, содержали что-то вроде:

survey[question][title]=knights

С этого, похоже, что правильное решение:

data-url="<%= url_for @survey %>" data-object="survey[question]" data-attribute="title"

Когда данные POST построены, вы должны получить survey[question][title], чего и ожидает update_attributes.

1 голос
/ 17 июля 2011

Можно ли определить маршрут для обновления вопроса?Тогда, похоже, вы могли бы написать:

<span class="rest_in_place" data-url="<%= url_for @survey.question %>" data-object="question" data-attribute="title">
  <%= @survey.question.title %>
</span>
...