Ruby on Rails-컨트롤러

Rails 컨트롤러는 애플리케이션의 논리적 중심입니다. 사용자, 뷰 및 모델 간의 상호 작용을 조정합니다. 컨트롤러는 또한 여러 중요한 보조 서비스의 본거지입니다.

  • 외부 요청을 내부 작업으로 라우팅하는 역할을합니다. 사람에게 친숙한 URL을 매우 잘 처리합니다.

  • 캐싱을 관리하여 애플리케이션 성능을 향상시킬 수 있습니다.

  • 코드를 대량으로 늘리지 않고 뷰 템플릿의 기능을 확장하는 도우미 모듈을 관리합니다.

  • 세션을 관리하여 사용자에게 애플리케이션과의 지속적인 상호 작용에 대한 인상을줍니다.

컨트롤러를 만드는 과정은 매우 쉽고, 우리가 이미 모델을 만드는 데 사용한 과정과 비슷합니다. 여기서는 하나의 컨트롤러 만 생성합니다.

library\> rails generate controller Book

Book을 대문자로하고 단수 형식을 사용하고 있음을 유의하십시오. 이것은 컨트롤러를 생성 할 때마다 따라야하는 Rails 패러다임입니다.

이 명령은 다음과 같은 몇 가지 작업을 수행합니다.

  • 다음과 같은 파일을 생성합니다. app/controllers/book_controller.rb

book_controller.rb를 보면 다음과 같이 찾을 수 있습니다.

class BookController < ApplicationController
end

컨트롤러 클래스 는 컨트롤러 폴더의 다른 파일 인 ApplicationController에서 상속 합니다.application.rb.

와 ApplicationController은 모든 컨트롤러에서 실행 할 수있는 코드를 포함하고 그것은 레일에서 상속 ActionController :: 기본 클래스입니다.

아직 ApplicationController에 대해 걱정할 필요가 없으므로 몇 가지 메서드 스텁을 정의하겠습니다.book_controller.rb. 요구 사항에 따라이 파일에서 원하는 수의 함수를 정의 할 수 있습니다.

다음과 같이 파일을 수정하고 변경 사항을 저장하십시오. 이러한 메서드에 어떤 이름을 부여할지는 사용자가 결정하지만 관련 이름을 지정하는 것이 좋습니다.

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

이제 모든 메서드를 하나씩 구현해 보겠습니다.

list 메서드 구현

list 메소드는 데이터베이스에있는 모든 책의 목록을 제공합니다. 이 기능은 다음 코드 줄에 의해 달성됩니다. book_controller.rb 파일에서 다음 행을 편집하십시오.

def list
   @books = Book.all
end

list 메소드 의 @books = Book.all 행은 Rails에게 books 테이블을 검색하고 찾은 각 행을 @books 인스턴스 객체에 저장하도록 지시합니다.

show 메서드 구현

show 메소드는 단일 책에 대한 추가 세부 사항 만 표시합니다. 이 기능은 다음 코드 줄에 의해 달성됩니다.

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

show 메소드의 @book = Book.find (params [: id]) 줄은 Rails에게 params [: id]에 정의 된 id를 가진 책만 찾도록 지시합니다.

params 개체는 메서드 호출간에 값을 전달할 수있는 컨테이너입니다. 예를 들어, list 메소드에 의해 호출되는 페이지에있을 때 특정 책에 대한 링크를 클릭하면 프로그램이 특정 책을 찾을 수 있도록 params 객체를 통해 해당 책의 ID를 전달할 수 있습니다.

새로운 방법 구현

새로운 메소드는 새로운 객체를 생성 할 것이라는 것을 Rails에게 알려줍니다. 따라서이 메서드에 다음 코드를 추가하면됩니다.

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

위의 메소드는 사용자 입력을받을 페이지를 사용자에게 표시 할 때 호출됩니다. 여기서 두 번째 줄은 데이터베이스에서 모든 주제를 가져 와서 @subjects라는 배열에 넣습니다.

create 메서드 구현

HTML 양식을 사용하여 사용자 입력을 받으면 데이터베이스에 레코드를 만들 차례입니다. 이를 위해 book_controller.rb의 create 메소드를 다음과 일치하도록 편집하십시오.

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

첫 번째 줄은 사용자가 제출 한 데이터로 만든 Book 개체를 보유하는 @book이라는 새 인스턴스 변수를 만듭니다. 그만큼book_params 메서드는 개체에서 모든 필드를 수집하는 데 사용됩니다. :books. 데이터는 params 객체를 사용하여 생성하기 위해 새 메서드에서 전달되었습니다.

다음 줄은 사용자를 다음으로 리디렉션하는 조건문입니다. list객체가 데이터베이스에 올바르게 저장되는 경우 메소드. 저장되지 않으면 사용자는 새 메소드로 다시 전송됩니다. redirect_to 메소드는 웹 페이지에서 메타 새로 고침을 수행하는 것과 유사합니다. 사용자 상호 작용없이 자동으로 목적지로 사용자를 전달합니다.

그러면 데이터가 성공적으로 저장되지 않고 새로운 옵션과 비슷한 경우가 될 경우 @subjects = Subject.all 이 필요합니다.

편집 메서드 구현

편집 방법은 show 방법과 거의 동일합니다. 두 메서드 모두 ID를 기반으로 단일 개체를 검색하고 페이지에 표시하는 데 사용됩니다. 유일한 차이점은 show 메서드를 편집 할 수 없다는 것입니다.

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

이 메서드는 사용자가 수정할 화면에 데이터를 표시하기 위해 호출됩니다. 두 번째 줄은 데이터베이스에서 모든 주제를 가져와 @subjects라는 배열에 넣습니다.

업데이트 방법 구현

이 메서드는 사용자가 데이터를 수정하고 데이터베이스에 변경 사항을 업데이트하려는 경우 편집 메서드 이후에 호출됩니다. 업데이트 방법은 생성 방법과 유사하며 데이터베이스의 기존 장부를 업데이트하는 데 사용됩니다.

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

update_attributes 메소드는 create에서 사용하는 save 메소드와 유사하지만 데이터베이스에 새 행을 생성하는 대신 기존 행의 속성을 덮어 씁니다.

그러면 데이터가 성공적으로 저장되지 않을 경우 @subjects = Subject.all 라인이 필요하며 편집 옵션과 유사하게됩니다.

삭제 메소드 구현

데이터베이스에서 레코드를 삭제하려면이 방법을 사용합니다. 이 메서드를 다음과 같이 구현하십시오.

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

첫 번째 줄은 params 객체를 통해 전달 된 매개 변수를 기반으로 분류 된 항목을 찾은 다음 destroy 메소드를 사용하여 삭제합니다. 두 번째 줄은 redirect_to 호출을 사용하여 사용자를 목록 메서드로 리디렉션합니다.

주제를 표시하는 추가 방법

주어진 주제에 따라 모든 책을 탐색 할 수있는 기능을 사용자에게 제공한다고 가정하십시오. 따라서 book_controller.rb 내에 모든 주제를 표시하는 메서드를 만들 수 있습니다. 메소드 이름이 다음과 같다고 가정합니다.show_subjects

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

마지막으로 book_controller.rb 파일은 다음과 같이 보일 것입니다-

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

이제 컨트롤러 파일을 저장하십시오.

다음은 무엇입니까?

백엔드에서 작동하는 거의 모든 방법을 만들었습니다. 다음으로 작업에 대한 경로 (URL)를 정의합니다.