2011-10-30 11 views
5

Czy w Rails 3 istnieje sposób wywoływania akcji (do zabawy z bazą danych) bez odświeżania lub uruchamiania akcji, a następnie przekierowania na bieżącą stronę?Szyny 3: Łącza, które wywołują akcje, ale nie opuszczają/odświeżają bieżącej strony?

Próbowałem zmylić z :remote => true w link_to, ale to nie działa dla mnie. A może źle zrozumiałem jego cel ... lub używam go niepoprawnie.

+1

': remote => true' powinno działać. Napisz więcej kodu. – Petr

+0

Zapisz tutaj swój kod. – megas

+0

No cóż, próbowałem użyć {} wokół: action i: id, a teraz działa! – Derek

Odpowiedz

6

Istnieją 2 scenariusze zazwyczaj mają Dzwoniąc akcję z widoku w Rails3:

  1. Korzystanie ze zwykłej wersji link_to wraz z jej odmianami.
  2. Korzystanie link_to z opcjonalnym argumentem :remote => true (domyślnie false)

W pierwsze jeden wyniki w normalnym cyklu żądanie/odpowiedź:

  1. połączeń akcja w kontrolerze.
  2. Jeśli nie wykonano żadnych specjalnych czynności (render lub redirect), po prostu wyrenderuj widok związany z akcją. Więc jeśli akcja nazywa się do_db_stuff, Rails3 próbuje renderować do_db_stuff.html.erg (lub do_db_stuff.html.haml`) w odpowiednim katalogu widoków.
  3. można to zmienić poprzez wywołanie wyraźnie render lub redirect pod koniec swojego działania:
    • render: Renders szablon nazwa, używając aktualnego stanu kontrolera.
    • : Przekieruj do nowej akcji (tego lub innego kontrolera) i użyj odpowiedniego szablonu do wyświetlenia.

Jest to np. używane podczas wywoływania w akcji create niektóre zapisać metodę, która nie powiedzie, to powrót do tej samej strony, wywołując render :action => "new" # doen't execute the method

sekund jeden po prostu wywołuje działanie i zwraca wynik do strony. Obowiązkiem strony jest to, co zrobić z tym. W nieco innym scenariuszu mam np. w mojej aplikacji coś, co wygląda tak:

  1. Po lewej stronie widoku znajduje się lista zadań.
  2. Do każdego elementu zadania jest zarejestrowany program obsługi kliknięcia, który wywołuje search_task (za pomocą JavaScript z AJAX) na kontrolerze.
  3. Sterownik odpowiada na to połączenie, wysyłając wynik połączenia zwrotnego render :partial ....
  4. Funkcja JavaScript w przewodnika zarejestrował funkcję sukces, który wygląda tak:

    element.bind('click', function() { 
        $('#left').children().removeClass('selected') 
        element.addClass('selected'); 
        $.ajax({url: '/tasks/search_task/' + task_id, 
         async: false, 
         dataType: 'html', 
         success: function(data) { 
          target.html(data); 
         }}); 
    } 
    

    (nie dołączone cały click-funkcji tutaj)

  5. więc wynik (gdy sukces wysłana) będzie powoduje, że treść target zostanie zastąpiona wysłanym kodem HTML.

Nie wiem, czy coś podobnego jest możliwe z link_to, być może jest opcja.

Tak, :remote => true powinien zadziałać, jeśli chcesz tylko zignorować wynik.

+0

Dziękuję za dobre wyjaśnienie. W swojej odpowiedzi napisałeś: "to odpowiedzialność strony, co zrobić z tym", i zastanawiałem się: jak mogę powiedzieć stronie, co z nią zrobić? – Derek

+0

Edytuję swoją odpowiedź, aby być tutaj bardziej zrozumiałym. – mliebelt

2

używam żądania AJAX do tego:

<%= link_to "stock", { :controller => 'ReadItLater', :action => "stock", 
        :qid => q.question_id } , :remote => true, :class=>'ddm' %> 

Oto kod kontrolera:

def stock 
     @user = UserData.find_by_login(session[:cuser]) 
     @user.stock(params) 

     respond_to do |format| 
      format.js { render :layout=>false } 
     end 
    end 
Powiązane problemy