Как заставить ответы AJAX работать со стороны Rails? - PullRequest
2 голосов
/ 20 ноября 2011

HTML-форма:

<form id="newsletter" method="post" action="/subscribers" data-remote="true">
    <label for="email">Enter your email:</label>
    <input type="text" name="email" class="text" />
    <p class="btn"><span>Signup</span></p>
</form>

Обратите внимание на data-remote="true"

Контроллер:

class SubscribersController < ApplicationController
  def create
    @subscriber = Subscriber.create(:email      => params[:email],
                                    :ip_address => request.remote_ip )

    respond_to do |format|
      format.js
    end
  end
end

Просмотр (подписчиков / create.js.erb)

no clue what goes here to make it return normal AJAX response (or error if it encountered one

1. Что я помещаю в представление, чтобы оно возвращало нормальный ответ или ошибку AJAX? - Нужно ли начинать с этого (можно ли это вернуть, не создавая такие представления)

2. Это правильный способ сделать ajax с Rails?

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Это выглядит точно так же, как вопрос, на который я только что ответил сегодня для другого пользователя ... те же названия моделей и все.

def create
  @subscriber = Subscriber.new(#your params)
  respond_to do |format|
    if @subscriber.save
      format.js { render :json => @subscriber, :status => :created, :location => @susbscriber }
    else
      format.js { render :json => @susbcriber.errors, :status => :unprocessable_entity }
    end
  end
end

Кроме того, вам не нужно делать unless Subscriber.find_by_email(params[:email]) в вашемконтроллер.Вам просто нужно добавить validates_uniqueness_of :email к модели подписчика.

В файле .erb, который содержит форму, вы должны добавить следующий javascript:

jQuery(function($) {
  // create a convenient toggleLoading function
  var toggleLoading = function() { $("#loading").toggle() };

  $("#your-form")
    .bind("ajax:loading",  toggleLoading)
    .bind("ajax:complete", toggleLoading)
    .bind("ajax:success", function(event, data, status, xhr) {
      $("#response").html(data);
    });
    .bind("ajax:failure", function(event, data, status, xhr) {
      //your code
    });
});
1 голос
/ 20 ноября 2011

Стандартный блок response_to (допускающий как html, так и js) будет:

respond_to do |format|  
  if @subscriber.save  
    format.html { redirect_to(@subscriber, :notice => 'Subscriber created.') }  
    format.js # Not redirecting, just spitting out the JSON(js?) response (I believe).  
  else  
    format.html { render :action => "new" }  
    format.js # Not redirecting for js and this time return error response. 
  end  
end  

То, что у тебя есть, на самом деле выглядит нормально для меня. Работает нормально или есть проблема?

Вышеуказанное должно работать с рельсами2 и рельсами3. Rails3 имеет более лаконичный синтаксис (конечно), но, учитывая, что вы Rails2, я оставлю это сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...