3

私がしたいのは、アカウントが正常に作成されたときに、送信されたフォームが消え、メッセージが表示されることです (登録のステータスによって異なります)。

成功した場合は、「ありがとうございます。メールを確認してください」という簡単なメッセージが表示されます。

そうでない場合は、「申し訳ありませんが、そのメールは既に取得されています」などの適切なメッセージが表示されます。

これは私のフォームです:

<div class="nine columns offset-by-three sign-up-form">
  <%= form_for(resource, :as => resource_name, :class => "send-with-ajax", :url => user_registration_path(resource), :validate => true, :html => { :id => 'user_new' }) do |f| %>
    <div class="six columns alpha"> 
       <%= f.text_field :email, :placeholder => "your-email@address.com", :input_html => {:autofocus => true}, :validate => true %>
    </div>              
    <div class="three columns sign-up alpha">
      <%= f.submit :label => "Submit", :value => "Sign Me Up!"  %>
      <div class="ajax-response"><%= devise_error_messages! %></div>
    </div>
    <% end %>
  </form>
</div>

これは私のcreate.js.erbです:

$(document).ready(function() {    
  $('#user_new').submit(function() { 
    $(this).fadeOut(600).hide(); 
    $(this).append('<h3>Thank You. You should receive an email shortly.</h3>').fadeIn(1000);
  });    
)}

しかし、これは正しく機能しません。たとえば、送信を押したときにメールアドレスが既にデータベースにある場合、何も起こりません。

PSそれが「通常の」フォームである場合、format.jsこのフォームを処理しているコントローラー内で実行し、そこでステータスコードとメッセージを処理することを知っていますが、Deviseは別の獣であり、新しいフォームを生成したくありません完全に快適ではない場合、すべきではないコントローラーとオーバーライド機能。

4

2 に答える 2

2

Devise がrespond_withコントローラーDevise::Registrationsで使用するように、単純な AJAX 呼び出しを使用してフォームを送信し、応答を取得できるはずです。これは私が知っている最も単純な形式です。

これを行うには、次の Javascript コードをサインアップ フォーム ページに追加します。

$("#user_new").submit(function(){
  $.ajax({
    url: "/users",
    success: function(){
      $(this).fadeOut(600).hide(); 
      $(this).append('<h3>Thank You. You should receive an email shortly.</h3>').fadeIn(1000);
    },
    error: function(){
      // Put your error code here
    }
  });
});

作成後に create.js.erb ファイルを使用する場合は、次のようにする必要があります。

  • とを:format => :js_:remote => trueform_for
  • このコードのみをcreate.js.erbファイルに含める必要があります。

    $("#user_new").fadeOut(600).hide().append('<h3>Thank You. You should receive an email shortly.</h3>').fadeIn(1000);
    

このようにすると、Devise は成功した場合、AJAX 応答の後に :js ファイルの内容を実行します。

于 2012-06-19T12:41:22.573 に答える
0

私のために働いた方法は

最初に:remote => trueサインアップフォームに入力してください

次に、2つのオプションがあります

  1. フォームが repond_to :js であり、コントローラーの js ファイルにあることを確認します (具体的には、私の場合は、ページ コントローラー (pages#home) のホーム アクションでした)。
 $(function() {
      return $(".new_user").ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
        if (jqXHR.status === 401) {
          $("#notice").fadeIn();
          $("#notice").html(jqXHR.responseText).fadeOut(1000);
        }
      });
    });
  1. 2 番目のオプションは、rails/devise によって自動的に使用される js ファイルを使用することです。これは、/views/devise/registrations の下に作成する必要がある create.js.erb です。そのファイルは次のようなものになります
   $("#signUpForm").bind("ajax:success", function(xhr, data, status) {
  <% if resource.errors.full_messages.count <1 %>
      $("#noticesignup").html("Confirmation Mail Sent :) ");
  <% else %>
      $("#noticesignup").html("<%= escape_javascript ( devise_error_messages!) %>");
  <% end %>
});

そしてほとんどそれだけです

于 2012-11-01T05:15:17.553 に答える