1

呼び出された単純なモデルがProjectあり、後で使用するために短い URL を保存する必要があるとしましょう。それを計算する最良の方法はいつですか?

私が今持っている最善の解決策は after_create フックですが、それは次のようなコードにつながります

ショート URL || Rails.application.routes.url_helpers.project_path(プロジェクト、ホスト: HOSTNAME)

モデルから URL にアクセスするのは適切ではありません。

要するに、short_url を計算するコードをどこに置くのでしょうか?

ありがとうございました、

4

2 に答える 2

0

このコードをコントローラーに追加します。

class ProjectsController < ApplicationController
  def create
    @project = Project.new(params[:project])

    respond_to do |format|
      if @project.save
        @project.update_attribute(:short_url, project_url(@project))
        (..)
  end
end

このコードは、http/url を処理するため、コントローラーに属しているように感じます。データベースへの保存は問題ないように思えますが、URL を要求するのはコントローラーの責任です。

この線:

@project.update_attribute(:short_url, project_url(@project))

project_url ヘルパーを呼び出すことができるのは、.save (または .create) への呼び出しの下に追加する必要があるためです (プロジェクト オブジェクトは既に ID を取得しています)。

于 2013-03-30T15:37:11.660 に答える
0

short_url代わりに正確なものを保存したくない理由はありますか? したがって、プロジェクト オブジェクトの URL が必要な場合は、short_url が存在するかどうかを確認するだけです。プロジェクトのURLを決定するためにデコレータを追加するだけでよいと思います。

#using Draper
class ProjectDecorator < Draper::Decorator
  def effective_url
    source.short_url.present? ? source.short_url : project_path(source)
    # or source.short_url || project_path(source) if short_url will not be an empty string
    # or source.short_url || source
  end
end
于 2013-03-30T10:48:31.070 に答える