1

以下の例でユーザーを作成するには、ユーザーを作成するため に必須であるため、ロードする必要が@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

皆さんは普段どのようにシナリオに取り組んでいますか?

4

1 に答える 1

1

これは個人的な好みの問題ですが、私たちのプロジェクトでは、適切な場合はビューで行い、複雑な場合は before_filter で行います。

ビュー - ロジックがない場合に適しています。このための変数を作成する必要はありません。フォームがパーシャルに含まれている場合は、一度だけ実行されるので簡単に維持できるため、非常に便利です。

<%= form.select :project_id, Project.all, :id, :name %>

何らかの要因に応じて変化する可能性がある場合は、コントローラーの before_filter:

MyController
  before_filter :find_projects, :except => [:destroy, :some_method] # Will load the values but not for the destroy or some_method actions

  def find_projects
    @projects = Project.where(:some conditions => true)
  end
于 2013-06-13T14:09:12.717 に答える