繁体   English   中英

在嵌套属性中使用 REST

[英]Using REST in Place with nested attributes

REST in Place是 Jan Varwig 开发的一款出色的 rails 插件,它使用 AJAX 在线编辑 object 属性。 它非常易于设置,易于实现,并且通常运行良好。

我已经在网上阅读了使用 REST 和嵌套属性的人,但实际上我没有发现任何关于它是如何完成的提及。 我不认为它太难了,但是我还没有弄清楚(尽管我对非嵌套属性没有任何问题)。

我有一份调查 model:

class Survey < ActiveRecord::Base
  has_one :question, :dependent => destroy
  accepts_nested_attributes_for :question

  attr_accessible :description
  validates_presence_of :description
end

和相应的问题 model:

class Question < ActiveRecord::Base
  belongs_to :survey

  attr_accessible :title, :contents
  validates_presence_of :title, :contents
end

我的尝试产生了三种情况:

1. 使用非嵌套属性实现的 REST 就地 — [作品]

视图中的代码如下所示:

<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 — [部分有效]

因此,我认为如果我可以阻止创建新问题,它可能会起作用(即使这不是一个适当的解决方案,因为我需要为每个新调查创建新问题)。 我将调查 model 的代码更改为以下内容:

class Survey < ActiveRecord::Base
  has_one :question, :dependent => destroy
  accepts_nested_attributes_for :question, :update_only => true

  ...

end

然后,有趣的是,AJAX 请求运行良好——当我更改问题属性时,它已在数据库中更新,但由于某种原因,它卡在“正在保存...”并且从未恢复新更新的属性。 重新加载页面当然可以很好地显示新文本,但是使用 AJAX 的全部目的是为了防止这种必要性。


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

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

<span class="rest_in_place" data-url="<%= url_for @survey.question %>" data-object="question" data-attribute="title">
  <%= @survey.question.title %>
</span>

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所期望的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM