要在下面的示例中创建用户,我必须加载 它们@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
大家平时是怎么处理剧情的呢?