Ruby on Rails - kontroler

Kontroler Rails jest logicznym centrum twojej aplikacji. Koordynuje interakcję między użytkownikiem, widokami i modelem. Kontroler jest również domem dla wielu ważnych usług pomocniczych.

  • Odpowiada za kierowanie żądań zewnętrznych do akcji wewnętrznych. Bardzo dobrze obsługuje przyjazne dla ludzi adresy URL.

  • Zarządza buforowaniem, co może zwiększyć wydajność aplikacji o rzędy wielkości.

  • Zarządza modułami pomocniczymi, które rozszerzają możliwości szablonów widoków bez łączenia ich kodu.

  • Zarządza sesjami, dając użytkownikom wrażenie ciągłej interakcji z naszymi aplikacjami.

Proces tworzenia kontrolera jest bardzo łatwy i podobny do procesu, którego już używaliśmy do tworzenia modelu. Stworzymy tutaj tylko jeden kontroler -

library\> rails generate controller Book

Zwróć uwagę, że zapisujesz książkę wielką literą i używasz liczby pojedynczej. To jest paradygmat Rails, którego powinieneś przestrzegać za każdym razem, gdy tworzysz kontroler.

To polecenie wykonuje kilka zadań, z których poniższe mają znaczenie:

  • Tworzy plik o nazwie app/controllers/book_controller.rb

Jeśli spojrzysz na book_controller.rb, znajdziesz go w następujący sposób -

class BookController < ApplicationController
end

Klasy kontrolerów dziedziczą po ApplicationController, czyli drugim pliku w folderze controllers:application.rb.

ApplicationController zawiera kod, który można uruchomić we wszystkich kontrolerach i dziedziczy z Rails ActionController :: Base klasy.

Na razie nie musisz się martwić o ApplicationController , więc po prostu zdefiniujmy kilka kodów pośredniczących metod wbook_controller.rb. W zależności od wymagań możesz zdefiniować dowolną liczbę funkcji w tym pliku.

Zmodyfikuj plik tak, aby wyglądał jak poniżej i zapisz zmiany. Pamiętaj, że to od Ciebie zależy, jaką nazwę chcesz nadać tym metodom, ale lepiej nadaj im odpowiednie nazwy.

class BookController < ApplicationController
   def list
   end
   
   def show
   end
   
   def new
   end
   
   def create
   end
   
   def edit
   end
   
   def update
   end
   
   def delete
   end
   
end

Teraz zaimplementujmy kolejno wszystkie metody.

Implementacja metody listy

Metoda list wyświetla listę wszystkich książek w bazie danych. Ta funkcjonalność zostanie osiągnięta przez następujące wiersze kodu. Edytuj następujące wiersze w pliku book_controller.rb.

def list
   @books = Book.all
end

Linia @books = Book.all w metodzie list mówi Railsom, aby przeszukał tabelę książek i zapisał każdy znaleziony wiersz w obiekcie instancji @books.

Wdrażanie metody pokazowej

Metoda show wyświetla tylko dalsze szczegóły dotyczące jednej książki. Ta funkcjonalność zostanie osiągnięta przez następujące wiersze kodu.

def show
   @book = Book.find(params[:id])
end

Linia @book = Book.find (params [: id]) metody show nakazuje Railsom znalezienie tylko tej książki, która ma identyfikator zdefiniowany w params [: id].

Obiekt params jest kontenerem, który umożliwia przekazywanie wartości między wywołaniami metod. Na przykład, gdy jesteś na stronie wywołanej metodą list, możesz kliknąć łącze do określonej książki, która przekazuje identyfikator tej książki za pośrednictwem obiektu params, aby program mógł znaleźć określoną książkę.

Wdrażanie nowej metody

Nowa metoda pozwala Railsom wiedzieć, że utworzysz nowy obiekt. Więc po prostu dodaj następujący kod w tej metodzie.

def new
   @book = Book.new
   @subjects = Subject.all
end

Powyższa metoda zostanie wywołana, gdy wyświetlisz użytkownikowi stronę, na której można wprowadzić dane wejściowe. Tutaj druga linia pobiera wszystkie tematy z bazy danych i umieszcza je w tablicy o nazwie @subjects.

Implementacja metody create

Po wprowadzeniu danych przez użytkownika za pomocą formularza HTML nadszedł czas, aby utworzyć rekord w bazie danych. Aby to osiągnąć, edytuj metodę create w book_controller.rb, tak aby pasowała do następującego -

def create
   @book = Book.new(book_params)
	
   if @book.save
      redirect_to :action => 'list'
   else
      @subjects = Subject.all
      render :action => 'new'
   end
   
end

def book_params
   params.require(:books).permit(:title, :price, :subject_id, :description)
end

Pierwsza linia tworzy nową zmienną instancji o nazwie @book, która zawiera obiekt Book zbudowany na podstawie danych przesłanych przez użytkownika. Plikbook_params Metoda służy do zbierania wszystkich pól z obiektu :books. Dane zostały przekazane z nowej metody do utworzenia przy użyciu obiektu params.

Następna linia to instrukcja warunkowa, która przekierowuje użytkownika do listmetoda, jeśli obiekt zapisuje się poprawnie w bazie danych. Jeśli nie zapisze, użytkownik zostanie odesłany z powrotem do nowej metody. Metoda redirect_to jest podobna do wykonywania metaodświeżania na stronie internetowej: automatycznie przekierowuje Cię do miejsca docelowego bez żadnej interakcji z użytkownikiem.

Wtedy @subjects = Subject.all jest wymagane na wypadek, gdyby dane nie zostały pomyślnie zapisane i sytuacja wygląda podobnie jak w przypadku nowej opcji.

Implementacja metody edycji

Metoda edit wygląda prawie identycznie jak metoda show. Obie metody służą do pobrania pojedynczego obiektu na podstawie jego identyfikatora i wyświetlenia go na stronie. Jedyna różnica polega na tym, że metody show nie można edytować.

def edit
   @book = Book.find(params[:id])
   @subjects = Subject.all
end

Ta metoda zostanie wywołana w celu wyświetlenia danych na ekranie do zmodyfikowania przez użytkownika. Druga linia pobiera wszystkie tematy z bazy danych i umieszcza je w tablicy o nazwie @subjects.

Implementacja metody aktualizacji

Ta metoda zostanie wywołana po metodzie edit, gdy użytkownik modyfikuje dane i chce zaktualizować zmiany w bazie danych. Metoda aktualizacji jest podobna do metody tworzenia i będzie używana do aktualizacji istniejących książek w bazie danych.

def update
   @book = Book.find(params[:id])
	
   if @book.update_attributes(book_param)
      redirect_to :action => 'show', :id => @book
   else
      @subjects = Subject.all
      render :action => 'edit'
   end
   
end

def book_param
   params.require(:book).permit(:title, :price, :subject_id, :description)
end

Metoda update_attributes jest podobna do metody zapisywania używanej przez create, ale zamiast tworzyć nowy wiersz w bazie danych, zastępuje atrybuty istniejącego wiersza.

Następnie wiersz @subjects = Subject.all jest wymagany na wypadek, gdyby dane nie zostały pomyślnie zapisane, wtedy staje się podobny do opcji edycji.

Implementacja metody usuwania

Jeśli chcesz usunąć rekord z bazy danych, użyjesz tej metody. Zaimplementuj tę metodę w następujący sposób.

def delete
   Book.find(params[:id]).destroy
   redirect_to :action => 'list'
end

Pierwsza linia wyszukuje klasyfikację na podstawie parametru przekazanego przez obiekt params, a następnie usuwa ją metodą zniszczenia. Druga linia przekierowuje użytkownika do metody list przy użyciu wywołania redirect_to.

Dodatkowe metody wyświetlania tematów

Załóżmy, że chcesz udostępnić użytkownikom możliwość przeglądania wszystkich książek na dany temat. Możesz więc utworzyć metodę wewnątrz book_controller.rb, aby wyświetlić wszystkie tematy. Załóżmy, że nazwa metody toshow_subjects -

def show_subjects
   @subject = Subject.find(params[:id])
end

Wreszcie twój book_controller.rb plik będzie wyglądał następująco -

class BooksController < ApplicationController

   def list
      @books = Book.all
   end

   def show
      @book = Book.find(params[:id])
   end
  
   def new
      @book = Book.new
      @subjects = Subject.all
   end

   def book_params
      params.require(:books).permit(:title, :price, :subject_id, :description)
   end

   def create
      @book = Book.new(book_params)

      if @book.save
         redirect_to :action => 'list'
      else
         @subjects = Subject.all
         render :action => 'new'
      end
   end
   
   def edit
      @book = Book.find(params[:id])
      @subjects = Subject.all
   end
   
   def book_param
      params.require(:book).permit(:title, :price, :subject_id, :description)
   end
   
   def update
      @book = Book.find(params[:id])
      
      if @book.update_attributes(book_param)
         redirect_to :action => 'show', :id => @book
      else
         @subjects = Subject.all
         render :action => 'edit'
      end
   end
   
   def delete
      Book.find(params[:id]).destroy
      redirect_to :action => 'list'
   end
   
   def show_subjects
      @subject = Subject.find(params[:id])
   end

end

Teraz zapisz plik kontrolera.

Co jest następne?

Stworzyłeś prawie wszystkie metody, które będą działać na zapleczu. Następnie zdefiniujemy trasy (adresy URL) dla akcji.