0

Railsは初めてです。コントローラーを薄く保つためにサービスレイヤーを使用しています。すべてのサービスレイヤーファイルは、、、にapp/services/domainありapp/services/applicationますapp/services/infrastructure。たとえば、これが私の会社のサービスです。

class CompanyService

  def self.create(params)
    company = Company.new(params)
    rst = true
    ActiveRecord::Base.transaction do
      begin
        company.save!
      rescue ActiveRecord::RecordInvalid
        rst = false
      rescue ActiveRecord::StatementInvalid
        rst = nil
      end
    end
    return company, rst
  end

  def self.update(params)
    company = get_company(params[:id])
    rst = true
    ActiveRecord::Base.transaction do
      begin
        company.old_category_ids = company.category_ids
        company.assign_attributes(params[:company])

        decrease_category_ids = company.old_category_ids-company.category_ids
        decrease_counters(decrease_category_ids)

        increase_category_ids = company.category_ids-company.old_category_ids
        increase_counters(increase_category_ids)

        company.save!
      rescue ActiveRecord::RecordInvalid
        rst = false
      rescue ActiveRecord::StatementInvalid
        rst = nil
      end
    end
    return company, rst
  end # end update

そしてここに会社のコントローラーがあります:

    def create
      @company, rst = CompanyService.create(params[:company])
      if rst == true
        redirect_to(admin_companies_url, notice: "Company was successfully created.")
      elsif rst == false
        render active_admin_template('new.html.erb')
      else
        redirect_to admin_companies_url, notice: "Something went wrong. Please try again."
      end
    end

    def update
      @company, rst = CompanyService.update(params)
      if rst
        redirect_to admin_company_url(company), notice: "Company was successfully updated."
      elsif rst == false
        render active_admin_template('edit.html.erb')
      elsif rst == nil
        redirect_to admin_companies_url, notice: "Something went wrong. Please try again."
      end
    end

    def destroy
      CompanyService.destroy(params[:id])
      redirect_to admin_companies_url
    end

だから私は2つの質問があります:

  1. 私のコントローラーコードは良くないことを知っています。それを改善する方法は?
  2. 私のサービスは、本番環境および開発環境に自動的にロードされません。なんで?

英語が下手でごめんなさい。すべてのアドバイスと助けてくれてありがとう。

4

1 に答える 1

4

モデルを使用したり、サービスを介してモデルの相互作用を抽象化したりしたくない理由はありますか?

サービスを自動的にロードするには、config/application.rb内のautoloadconfig.autoload_pathsにサービスパスを含める必要があります

また、不良レコード(無効なレコードまたは無効なステートメント)を再確認します。レコードが保存されなかった理由に関係なく、ユーザーエクスペリエンスは同じになるため、ifをネストする理由はありません。コントローラは、アクションが成功したかどうかを知る必要があります

于 2012-05-15T01:16:52.773 に答える