Ruby-on-rails-2.1-rails-controllers
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
ここで、コントローラーファイルを保存し、次の割り当てのために出てきます。
次は何ですか?
バックエンドで機能するほとんどすべてのメソッドを作成しました。 次に、データを表示し、ユーザーから入力を受け取るための画面を生成するコードを作成します。