REST in Place是 Jan Varwig 的一款出色的 Rails 插件,它使用 AJAX 内联编辑对象属性。它非常易于设置,易于实现,并且通常运行良好。
我已经在网上阅读了使用带有嵌套属性的 REST in Place 的人,但实际上我还没有发现任何关于它是如何完成的提及。我不认为它太难了,但是我还没有弄清楚(尽管我对非嵌套属性没有任何问题)。
我有一个调查模型:
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 — [作品]
视图中的代码如下所示:
<span class="rest_in_place" data-url="<%= url_for @survey %>" data-object="survey" data-attribute="description">
<%= @survey.description %>
</span>
而且效果很好。当您单击描述时,会出现一个表单 text_field,其中包含 oldValue(来自内部 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
调查控制器中的操作),或者它正在重置两个值。
3. 设置嵌套属性:update_only => true
——[部分有效]
因此,我认为如果我可以阻止创建新问题,它可能会起作用(即使这不是一个适当的解决方案,因为我需要为每个新调查创建新问题)。我将调查模型的代码更改为以下内容:
class Survey < ActiveRecord::Base
has_one :question, :dependent => destroy
accepts_nested_attributes_for :question, :update_only => true
...
end
然后,有趣的是,AJAX 请求运行良好——当我更改问题属性时,它已在数据库中更新,但由于某种原因,它卡在“正在保存...”,并且从未恢复新更新的属性。重新加载页面当然可以很好地显示新文本,但使用 AJAX 的全部目的是防止这种必要性。
那应该就是一切。如果您对为什么会出现这些问题有任何想法,以及您是否有解决这些问题的建议,请告诉我。谢谢!