1

:remote => trueRailsアプリで編集フォームに追加すると、送信は正常に機能しますが、プログラムにエラーメッセージが表示されなくなりました。私は複数の解決策を試しましたが、どれもうまくいきませんでした。誰かがこの問題を解決するために私を正しい方向に向けることができますか?エントリが正常に保存されると、通知メッセージがdivに追加されます。これはedit.js.erbに書き込んだものです。'エラーメッセージ'をエラーメッセージdivに追加しようとしましたが、追加しても@entry.errors.any?trueが返されません:remote => true

これは、更新しようとしているフォームの編集divです。

<div id="errors">
  <% if @entry.errors.any? %>
      <h2><%= pluralize(@entry.errors.count, "error") %> prohibited this entry from being saved:</h2>

      <ul>
      <% @entry.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
  <% end %>
</div>

また、その内容はパーシャルにあり、edit.js.erbは新しくレンダリングされたパーシャルでdivを更新しようとしますが、@ entry.errors.any?ここではもうtrueを返していません..これも私のコントローラーです...

# GET /entries/1/edit
def edit
  @entry = Entry.find(params[:id])

  respond_to do |format|
    format.html
    format.js
  end
end


def update
  @entry = Entry.find(params[:id])

  respond_to do |format|
    if @entry.update_attributes(params[:entry])
      format.html { redirect_to edit_entry_path(@entry), notice: 'Entry was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @entry.errors, status: :unprocessable_entity }
    end
  end
end
4

3 に答える 3

2

コントローラを次のように変更できます:

def update
  @entry = Entry.find(params[:id])

  respond_to do |format|
    if @entry.update_attributes(params[:entry])
      format.html { redirect_to edit_entry_path(@entry), notice: 'Entry was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.js
    end
  end
end

app / views / my_controllers / update.js.erbを作成し、次のように配置します。

//Just normal javascript and some JS
errors = '';
<% @entry.errors.full_messages.each do |msg| %>
  errors += '<%= msg %>\n';
<% end %>
alert(errors);

編集:2番目のメソッドを追加します

あなたもこれを行うことができます:

$("#my_form")
 .bind("ajax:success", function(event, data, status, xhr) {
  //Do my function
});
于 2012-07-19T00:27:02.767 に答える
1

応答してformat.js、エラーレンダリングをyour.js.erbに追加します

に応答する.jsonとデータのみが返されるため、応答は実行されません。

于 2012-07-19T00:30:37.640 に答える
0

部分的な_errors.html.erbを作成しました

<% if @entry.errors.any? %>
    <h2><%= pluralize(@entry.errors.count, "error") %> prohibited this entry from being saved:</h2>
    <ul>
    <% @entry.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
<% end %>

update.js.erbを作成しました

$("#errorlist").html("<%= escape_javascript(render('errors')) %>");

ここで、#errorsは私のフォームのaを指し、エラーは部分的です。ついに私のコントローラーはこんな感じになりました。#PUT / items / 1#PUT /entries/1.json def update @entry = Entry.find(params [:id])

def update
  @entry = Entry.find(params[:id])

  respond_to do |format|
    if @entry.update_attributes(params[:entry])
      format.html { redirect_to edit_entry_path(@entry), notice: 'Entry was successfully updated.' }
      format.json { head :no_content }
    else
      format.html
      format.js
    end
  end
end

また、作成フォームではなく、編集フォームにajaxのみが必要なので(両方の_form.html.erbエフェクトに:remote => trueを追加)、_form.html.erbのこの行も変更しました。

<%= form_for @entry, :remote => true, :html => {:id => "editform", :multipart => true} do |f| %>

<%= form_for @entry, :remote => current_page?(:controller => 'entries', :action => 'new') ? false : true, :html => {:id => "editform", :multipart => true} do |f| %>

助けてくれてありがとう、私の解決策を達成するのを手伝ってくれた人たち。

于 2012-07-19T18:55:39.833 に答える