【问题标题】:Rails 4: parameterize acts_as_taggable_on urlsRails 4:参数化acts_as_taggable_on url
【发布时间】:2015-10-03 17:43:05
【问题描述】:

我正在为我的标签系统使用acts_as_taggable_on,其中每篇文章都有一个或多个标签。然而,它现在的设置方式,标签是大写的,并且在它们之间有空格和特殊字符,这些都会传递给我的路线。换句话说,像“巴拉克奥巴马”这样的标签一直传递到路线不变;看来我的网址完全未编码。

我想知道处理这个问题的正确方法是什么。

我的文章控制器如下所示:

class ArticlesController < ApplicationController
  before_action :set_articles, only: [:tagged]

  def tagged
    @tag = params[:tag]
    tagged_with = @articles.tagged_with(@tag)
    if @tag.present? && tagged_with.present?
      @articles = tagged_with
    else
      redirect_to root_path, alert: "Oops! There are no articles with tagged #{@tag}"
    end
  end

  private
  def set_articles
    @articles = user_signed_in? ? Article.all : Article.where published: true
  end
end

我的 routes.rb 看起来像这样:

Rails.application.routes.draw do
  root 'home#index'
  # This is the route that generates publicly facing tag urls:
  get 'tags/:tag', to: 'articles#tagged', as: :tag, tag: /.*/
  # This is for internal use:
  %w(people cities countries other).each do |tag|
    get tag, to: "articles#collect_tags", as: tag, tag: tag
  end
end

当我点击一个标签时,我的网址目前看起来像:

http://mywebsite.com/tags/Barack Obama

http://mywebsite.com/tags/Shinzō Abe

我不确定这些是在内部转义还是需要做些什么?任何建议表示赞赏。

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    我使用 friendly_id 处理标签标签的 url - 它会自动处理按名称或 id 进行搜索,您只需提供 slug 字段。

    首先,安装friendly_id

    https://github.com/norman/friendly_id

    创建迁移以将 slug 添加到您的标签

    #db/migrate/123123123123123_add_slug_to_tag.rb
    class AddSlugToTag < ActiveRecord::Migration
      def change
        add_column :tags, :slug, :string
        add_index :tags, :slug
      end
    end
    

    为acts_as_taggable_on 添加一个初始化器,用于设置一个slug。

    #config/initializers/friendly_acts_as_taggable.rb
    ActsAsTaggableOn::Tag.class_eval do
      extend FriendlyId
      friendly_id :name,
      use: [:slugged, :finders]
    end
    

    然后在你的控制器中,先找到标签,然后搜索你的对象列表

     #articles_controller.rb
     @tag = ActsAsTaggableOn::Tag.friendly.find(params[:tag])
     tagged_with = @articles.tagged_with(@tag)
    

    在没有友好 id 的情况下执行此操作

    您仍然需要上述所有组件,但情况会发生变化。

    你的初始化器看起来像:

    # This is so we can have slugs for tag urls
    ActsAsTaggableOn::Tag.class_eval do
      before_create :add_slug
      def add_slug
        self.slug = self.name.parameterize
      end
    end
    

    控制器中的查询应该是

    @tag = ActsAsTaggableOn::Tag.where(slug: params[:tag]).first
    

    【讨论】:

    • 有没有办法在不依赖其他您知道的 Gem 的情况下做到这一点?
    • 另外,我认为 before_create :add_slug 部分实际上应该是 before_save :add_slug 并检查 add_slug 方法以确保标签没有更改。上述解决方案仅在第一次创建标签时有效,并且将忽略任何未来的标签修改。
    【解决方案2】:

    看来a simpler solution 不需要任何额外的宝石。

    但是,经过进一步调查,我可以看到标签生成的 url 带有 %20 而不是空格,所以我相信acts_as_taggable_on 默认会生成安全的 url(但不要引用我的话!)

    【讨论】:

    • 你最终使用了什么解决方案?您是否只是将生成的 url 保留在 %20 中?我看到你对 valachi 的回答的帖子,但我不明白 if 语句。
    • 我只是保持原样。我认为这不会造成任何安全风险。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多