假设您有一个名为Project
的简单模型,您需要存储它的简短网址供以后使用,何时是计算它的最佳方式?
我现在拥有的最佳解决方案是after_create挂钩,但这会产生类似
的代码short_url || Rails.application.routes.url_helpers.project_path(项目,主持人:HOSTNAME)
从模型中访问网址感觉不对。
简而言之,您在哪里放置代码来计算short_url?
谢谢,
答案 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)。