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
私の試行では、3 つのシナリオが得られました。
1.ネストされていない属性で実装されたREST in Place — [動作]
ビュー内のコードは次のようになります。
<span class="rest_in_place" data-url="<%= url_for @survey %>" data-object="survey" data-attribute="description">
<%= @survey.description %>
</span>
そしてそれはうまく機能します。説明をクリックすると、(内側の HTML からの) oldValue が内部にあるフォーム text_field が表示されます。テキストを編集し、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
Survey コントローラーのアクションに送信されます)、または両方の値がリセットされます。
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 を使用することの全体的なポイントは、その必要性を防ぐことです。
それがすべてです。これらの問題が発生する理由について何か考えがあれば、またそれらを修正するための提案があれば教えてください。ありがとう!