[英]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
我的嘗試產生了三種情況:
視圖中的代碼如下所示:
<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 呈現新值。 這里一切都很好。
代碼看起來像這樣(如果有問題請告訴我)
<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
操作),或者它正在重置兩個值。
: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.