REST in Place是Jan Varwig开发的一个很棒的rails插件,它使用AJAX内联编辑对象属性。它非常容易设置,易于实现,并且通常运行良好。
我已经在网上读到人们使用REST的地方嵌套属性,但我实际上没有发现任何提及它是如何完成的。我不希望它太难,但我还没能弄清楚(尽管我对非嵌套属性没有遇到麻烦)。
我有一个Survey模型:
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>
效果很好。当您单击描述时,将出现一个表单text_field,其中包含oldValue(来自内部HTML)。我可以编辑文本,点击"Enter",表单提交AJAX更新并使用jQuery呈现新值。这里一切都好。
2。REST就地实现嵌套属性-[不工作]
代码看起来像这样(让我知道如果有什么错误)
<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
-[部分有效]
所以,我想如果我能阻止新问题的产生,它可能会起作用(尽管这不是一个充分的解决方案,因为我需要为每个新的调查创建新的问题)。我将Survey模型的代码改为如下:
class Survey < ActiveRecord::Base
has_one :question, :dependent => destroy
accepts_nested_attributes_for :question, :update_only => true
...
end
然后,有趣的是,AJAX请求工作得很好-当我改变一个问题属性时,它在数据库中更新,但由于某种原因,它被卡住了"保存…"并且从未恢复新更新的属性。重新加载页面当然可以很好地显示新文本,但使用AJAX的全部意义在于避免这种必要性。
应该就这些了。如果你对这些问题发生的原因有任何想法,如果你有解决这些问题的建议,请让我知道。谢谢!
jquery.rest_in_place.js
的第84行是:
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
所期望的。
是否可以为问题更新定义路由?然后你可以这样写:
<span class="rest_in_place" data-url="<%= url_for @survey.question %>" data-object="question" data-attribute="title">
<%= @survey.question.title %>
</span>