使用带有嵌套属性的REST



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>

相关内容

  • 没有找到相关文章

最新更新