以下の例でユーザーを作成するには、ユーザーを作成するため に必須であるため、ロードする必要が@projects
あります。@companies
class UsersController < ApplicationController
def new
@user = User.new
# duplication here
@projects = Project.all
@companies = Company.all
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user
else
# and here
@projects = Project.all
@companies = Company.all
render :action => "new"
end
end
end
ユーザーが無効な場合の新しいアクションと作成アクションのために、これらの依存関係を両方の(重複)ケースでロードする必要があります。
これらの依存関係をメソッドにカプセル化することでリファクタリングできload_user_dependencies
ます。
class UsersController < ApplicationController
def new
@user = User.new
load_user_dependencies
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user
else
load_user_dependencies
render :action => "new"
end
end
private
def load_user_dependencies
@projects = Project.all
@companies = Company.all
end
end
または、helper_methods として追加します。
class UsersController < ApplicationController
helper_method :projects, :companies
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user
else
render :action => "new"
end
end
def projects
@projects ||= Project.all
end
def companies
@companies ||= Company.all
end
end
ビュー オブジェクトを作成することもできます
class UserView
def products
@products ||= Product.all
end
def companies
@companies ||= Company.all
end
end
class UsersController < ApplicationController
def new
@user = User.new
@user_view = UserView.new
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user
else
@user_view = UserView.new
render :action => "new"
end
end
end
その他のオプションは、プレゼンターを使用することです
class UserPresenter < SimpleDelegator
def products
@products ||= Product.all
end
def companies
@companies ||= Company.all
end
end
class UsersController < ApplicationController
def new
@user = UserPresenter.new User.new
end
def create
@user = UserPresenter.new User.new(params[:user])
if @user.save
redirect_to @user
else
render :action => "new"
end
end
end
皆さんは普段どのようにシナリオに取り組んでいますか?