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

私の試行では、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され、新しい質問を作成しようとしていることが示されます (これは意味がないため、意味がありません)。リクエストは引き続きupdateSurvey コントローラーのアクションに送信されます)、または両方の値がリセットされます。

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 を使用することの全体的なポイントは、その必要性を防ぐことです。


それがすべてです。これらの問題が発生する理由について何か考えがあれば、またそれらを修正するための提案があれば教えてください。ありがとう!

4

2 に答える 2

1

の84 行jquery.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 に答える
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 に答える