5

簡単な質問ですが、Railscastをフォローしました

リモート true が機能するのはいいことですが、モデルを検証するにはどうすればよいですか?

私はこれを持っています

<%= form_for [:admin,@course], remote: true  do |f| %>
  <div class="field">
    <%= f.label :title, "The title:" %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description, "Descripcion:" %><br />
    <%= f.text_area :description %>
 </div>
 <div class="actions">
   <%= f.submit "Send"%>
 </div>
<% end %>

エラーを処理するにはどうすればよいですか?

def create

  @course = Course.new(params[:course])

  respond_to do |format|
    if @course.save
      format.html { redirect_to admin_index_url, :notice=> 'Done !!' }
      format.js
    else
      format.html { flash.now[:alert] = "Not done" 
                    render "new"
                  }
      format.js
    end
  end        
end

これが機能しない理由はありますか?

4

3 に答える 3

6

format.jsブロックは空であり、createアクションは:remote => trueを介して呼び出されるため、railsはデフォルトを実行します。これは、レンダリングするcreate.js.erbを検索することですが、おそらく検出されません。

説明のために、これをapp / views /?/create.js.erbのviewsディレクトリに配置します。

alert('HI');

次に、これをコントローラーに入れて、別の方法を確認します。

respond_to do |format|
  if @course.save
    format.html { redirect_to admin_index_url, :notice=> 'Done !!' }
    format.js { render :js=>'alert("done");' }
  else
    format.html { flash.now[:alert] = "Not done" 
                render "new"
                }
    format.js { render :js=>'alert("not done");' }
  end
end        

したがって、ここで、エラーメッセージをHTML / Javascriptに返送する必要があります。おそらく最も手ごわい方法は、適切な.js.erbファイルに入れることです。

于 2012-11-06T00:12:28.963 に答える
2

モデルでバリデーターを定義する必要があります。

 class Course 
    validates :title, :presence => true
 end

コントローラーで、 @course.save でインスタンスを保存しようとしました。保存されない場合は、呼び出してエラーを返します

    @course.errors.full_messages 

これらのエラーを処理したら、ビューに渡してユーザーにメッセージを表示します。format js でそれを行う方法を正確に覚えていません。

EDIT 2 ======== このリンクを確認してください: http://www.alfajango.com/blog/rails-3-remote-links-and-forms/ これを試してください

    respond_to do |format|
       if @course.save
          format.html { redirect_to admin_index_url, :notice=> 'Done !!' }
          format.js { render :js=>'alert("done");' }
       else
         render :json => @comment.errors, :status => :unprocessable_entity
       end
    end  


 In your javascript, bind the error callback and get the errors you passed in your controller.


 $(document).ready(function(){

$('#form_name').bind("ajax:error", function(evt, xhr, status, error){
  var $form = $(this),
      errors,
      errorText;

  try {
    // Populate errorText with the comment errors
    errors = $.parseJSON(xhr.responseText);
  } catch(err) {
    // If the responseText is not valid JSON (like if a 500 exception was thrown), populate errors with a generic error message.
    errors = {message: "Please reload the page and try again"};
  }

  // Build an unordered list from the list of errors
  errorText = "There were errors with the submission: \n<ul>";

  for ( error in errors ) {
    errorText += "<li>" + error + ': ' + errors[error] + "</li> ";
  }

  errorText += "</ul>";

  // Insert error list into form
  $form.find('div.validation-error').html(errorText);
});

});
于 2012-11-06T00:04:13.727 に答える
1

この目的のために jquery プラグインを開発しました。それを見てみる価値があるかもしれません。

https://github.com/bighostkim/remoteValidation

于 2013-02-05T22:08:46.007 に答える