0

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 的全部目的是防止这种必要性。


那应该就是一切。如果您对为什么会出现这些问题有任何想法,以及您是否有解决这些问题的建议,请告诉我。谢谢!

4

2 回答 2

1

是否可以为问题更新定义路线?然后看起来你可以写:

<span class="rest_in_place" data-url="<%= url_for @survey.question %>" data-object="question" data-attribute="title">
  <%= @survey.question.title %>
</span>
于 2011-07-17T03:24:39.310 回答
1

第84jquery.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预期的。

于 2011-07-17T04:09:01.957 回答