簡體   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