2012-03-02 18 views
9

Mam to, co moim zdaniem jest bardzo prostym problemem. Pochodzę z tła PhP i używałem tego cały czas, więc może patrzę na to w niewłaściwy sposób.Ruby on Rails: Akcja bez widoku

Próbuję utworzyć obsługę ajax w RoR. Gdy użytkownik kliknie przycisk, javascript odpala POST i przekazuje informację zwrotną użytkownika za pomocą parametru "success:" funkcji ajax jQuery.

Problem polega na tym, że RoR próbuje wczytać widok do obsługi ajaxera, kiedy naprawdę potrzebuję kilku linii w kontrolerze do wykonania pracy z bazą danych i wywołać echo kodu statusu, który zostanie zinterpretowany przez użytkownika. javascript.

To wszystko jest tylko stroną do przechowywania subskrypcji mailchimp, więc używam tylko kontrolera "macierzystego".

Moje trasy;

map.root :controller => 'home' 
map.connect '/mcsubscribe', :controller => 'home', :action => 'mcsubscribe' 

Mój kontroler domowy;

class HomeController < ApplicationController 
    def index 
    # no content 
    end 
    def mcsubscribe 
    print params[:email] 
    end 
end 

I moje testowanie javascript, tylko po to, aby zrozumieć, co się dzieje;

function mcSubscribe() { 
    var email = jQuery("#signup_input_email").val(); 
    jQuery.ajax({ 
     type: "POST", 
     url: "http://domain.com/mcsubscribe", 
     data: "email=" + email, 
     cache: false, 
     success: function(result) { 
      alert(result); 
     } 
    }); 
} 

Myślałem, że będzie to wspólny problem, ale ja googled wokół i tylko udało się znaleźć propozycje przekierować, gdy użytkownik nie będzie odwiedzić stronę/mcsubscribe, że nie wydaje się właściwe.

Odpowiedz

11

Korzystanie

print params[:email] 

będzie po prostu wydrukować tę wartość do logi aplikacji, a nie odpowiedzi.

Chcesz to:

render :text => params[:email] 
12

Wystarczy popatrzeć na http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

może zaistnieć potrzeba render :nothing => true

EDIT: misread pytanie, render :text => "yourtext" powinny pasować do Twoich potrzeb

+0

Rendering nic nie jest dokładnie to, co PO chce osiągnąć. Chce wydrukować tylko wartość 'params [: email]'. – Koraktor

+0

Z linku, ** render: text => params [: email] ** działa doskonale dzięki! Wiedziałem, że to musi być proste. – lynks

0

należałoby coś takiego:

def mcsubscribe 
    # Do something to unsubscribe 
    respond_to do |format| 
    format.html { redirect_to(success_page) } 
    format.js { render :text => params[:email] } 
    end 
end 

Jeżeli stosuje ajax The params[:email] jest wysłać jako tekst. Jeśli wymagany jest format HTML (np. Użytkownik kliknął łącze lub wypełnił zwykły formularz), zostanie wydane przekierowanie, informujące użytkownika, że ​​subskrypcja zakończyła się pomyślnie.

+0

Będę robił wszystkie opinie użytkowników na temat klienta, wygaszenie formularza, jeśli otrzymam zwrot "tak" od kontrolera i zanikanie w wiadomości. – lynks

+0

Po prostu pokazuje na kompletność :) I zaletą jest to, że działa również dla użytkowników bez JavaScript (włączony), jeśli są jakieś ... – Veger

0

W Rails 5 trzeba użyć 'zwykły':

render plain: params[:email]