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