一种计算和存储模型的简短URL的方法

时间:2013-03-30 10:26:25

标签: ruby-on-rails ruby activerecord

假设您有一个名为Project的简单模型,您需要存储它的简短网址供以后使用,何时是计算它的最佳方式?

我现在拥有的最佳解决方案是after_create挂钩,但这会产生类似

的代码
  

short_url || Rails.application.routes.url_helpers.project_path(项目,主持人:HOSTNAME)

从模型中访问网址感觉不对。

简而言之,您在哪里放置代码来计算short_url?

谢谢,

2 个答案:

答案 0 :(得分:0)

您是否有理由不想保存确切的short_url?因此,当您需要项目对象的url时,您可以检查short_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

答案 1 :(得分: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。存储在数据库中听起来不错,但要求网址是控制器的责任。

该行:

@project.update_attribute(:short_url, project_url(@project))
需要在调用.save(或.create)之后添加

,因为只有这样才能调用project_url助手(项目对象已经获得了它的ID)。