Ruby-on-rails-2.1-rails-controllers

提供:Dev Guides
移動先:案内検索

Ruby on Rails 2.1-コントローラー

Railsコントローラーは、アプリケーションの論理的な中心です。 ユーザー、ビュー、モデル間の相互作用を調整します。 コントローラーは、多くの重要な補助サービスのホームでもあります。

  • 外部リクエストを内部アクションにルーティングする責任があります。 人に優しいURLを非常にうまく処理します。
  • キャッシュを管理します。これにより、アプリケーションのパフォーマンスが大幅に向上します。
  • ヘルパーモジュールを管理します。ヘルパーモジュールは、コードを増やさずにビューテンプレートの機能を拡張します。
  • セッションを管理し、ユーザーにアプリケーションとの継続的な対話の印象を与えます。

コントローラーを作成するプロセスは非常に簡単で、モデルの作成にすでに使用したプロセスに似ています。 ここでコントローラーを1つだけ作成します-

C:\ruby\library\> ruby script/generate controller Book

Bookを大文字にし、単数形を使用していることに注意してください。 これは、コントローラーを作成するたびに従うべきRailsパラダイムです。

このコマンドはいくつかのタスクを実行しますが、ここでは以下が関連しています-

  • app/controllers/book_controller.rbというファイルを作成します。

あなたがbook_controller.rbを見てみると、次のようになります-

class BookController < ApplicationController
end

コントローラークラスはApplicationControllerを継承します。ApplicationControllerは、controllersフォルダー内の他のファイル application.rb です。

_ApplicationController_には、すべてのコントローラーで実行できるコードが含まれており、Rails _ActionController
Base class_を継承しています。

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

それでは、すべてのメソッドを1つずつ実装しましょう。

listメソッドの実装

listメソッドを使用すると、データベース内のすべての書籍を印刷できます。 この機能は、次のコード行によって実現されます。

def list
   @books = Book.find(:all)
end

listメソッドの_ @ books = Book.find(:all)_行は、booksテーブルを検索し、見つかった各行を@booksインスタンスオブジェクトに格納するようにRailsに指示します。

showメソッドの実装

showメソッドは、単一のブックの詳細のみを表示します。 この機能は、次のコード行によって実現されます。

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

showメソッドの_ @ books = Book.find(params [:id])_行は、params [:id]で定義されたIDを持つブックのみを検索するようにRailsに指示します。

_params_オブジェクトは、メソッド呼び出し間で値を渡すことができるコンテナです。 たとえば、listメソッドによって呼び出されるページにいるとき、特定の本のリンクをクリックすると、paramsオブジェクトを介してその本のIDが渡され、showが特定の本を見つけることができます。

新しいメソッドの実装

新しいメソッドは、新しいオブジェクトを作成することをRailsに知らせます。 このメソッドに次のコードを追加するだけです。

def new
   @book = Book.new
   @subjects = Subject.find(:all)
end

ユーザーにページを表示してユーザー入力を取得するときに、上記のメソッドが呼び出されます。 ここで、2行目はデータベースからすべてのサブジェクトを取得し、@ subjectsと呼ばれる配列に入れます。

createメソッドの実装

HTMLフォームを使用してユーザー入力を取得したら、データベースにレコードを作成します。 これを実現するには、book_controller.rbのcreateメソッドを編集して、次のものに一致させます-

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

最初の行は、ユーザーが送信したデータから作成されたBookオブジェクトを保持する@bookという新しいインスタンス変数を作成します。 データは、paramsオブジェクトを使用して作成する新しいメソッドから渡されました。

次の行は、オブジェクトがデータベースに正しく保存された場合にユーザーを list メソッドにリダイレクトする条件ステートメントです。 保存されない場合、ユーザーは新しいメソッドに戻されます。 redirect_toメソッドは、Webページでメタリフレッシュを実行するのに似ており、ユーザーの操作なしで自動的に宛先に転送します。

その後、データを正常に保存できず、新しいオプションの場合と同様の場合に、_ @ subjects = Subject.find(:all)_が必要です。

editメソッドの実装

editメソッドは、showメソッドとほとんど同じように見えます。 両方のメソッドを使用して、そのIDに基づいて単一のオブジェクトを取得し、ページに表示します。 唯一の違いは、showメソッドは編集できないことです。

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

このメソッドは、ユーザーが変更するデータを画面に表示するために呼び出されます。 2行目は、データベースからすべてのサブジェクトを取得し、@ subjectsという配列に入れます。

updateメソッドの実装

このメソッドは、ユーザーがデータを変更し、変更をデータベースに更新したいときに、editメソッドの後に呼び出されます。 更新方法は作成方法に似ており、データベース内の既存の本を更新するために使用されます。

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

update_attributesメソッドはcreateで使用されるsaveメソッドに似ていますが、データベースに新しい行を作成する代わりに、既存の行の属性を上書きします。

その後、データを正常に保存できない場合に_ @ subjects = Subject.find(:all)_行が必要になり、編集オプションに似たものになります。

deleteメソッドの実装

データベースのレコードを削除する場合は、このメソッドを使用します。 このメソッドを次のように実装します。

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

最初の行は、paramsオブジェクトを介して渡されたパラメーターに基づいて分類を検索し、destroyメソッドを使用して削除します。 2行目は、redirect_to呼び出しを使用してユーザーをリストメソッドにリダイレクトします。

件名を表示する追加の方法

特定の主題に基づいてすべての本を閲覧するための機能をユーザーに提供するとします。 book_controller.rb内にメソッドを作成して、すべてのサブジェクトを表示できます。 メソッド名が show_subjects であると仮定します。

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

最後に、 book_controller.rb ファイルは次のようになります-

class BookController < ApplicationController
   def list
      @books = Book.find(:all)
   end
   def show
      @book = Book.find(params[:id])
   end
   def new
      @book = Book.new
      @subjects = Subject.find(:all)
   end
   def create
      @book = Book.new(params[:book])
      if @book.save
            redirect_to :action => 'list'
      else
            @subjects = Subject.find(:all)
            render :action => 'new'
      end
   end
   def edit
      @book = Book.find(params[:id])
      @subjects = Subject.find(:all)
   end
   def update
      @book = Book.find(params[:id])
      if @book.update_attributes(params[:book])
         redirect_to :action => 'show', :id => @book
      else
         @subjects = Subject.find(: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

ここで、コントローラーファイルを保存し、次の割り当てのために出てきます。

次は何ですか?

バックエンドで機能するほとんどすべてのメソッドを作成しました。 次に、データを表示し、ユーザーから入力を受け取るための画面を生成するコードを作成します。