重定向到slug记录

时间:2015-12-27 17:37:38

标签: ruby-on-rails ruby

我为我的文章模型实现了一个非常简单的 slugification

# app/controllers/articles_controller.rb
def show
    @article = Article.find_by(slug: params[:slug])
end

# config/routes.rb
resources :articles, param: :slug

它的工作原理几乎没问题。但是有一个问题:

  def create
    @article = Article.new(article_params)
    if @article.save
      redirect_to @article  # <- here is the problem 
    else
      render 'new'
    end
  end

redirect_to重定向到articles/:id而不是articles/:slug

我必须在哪里配置?

2 个答案:

答案 0 :(得分:1)

创建新路线:

# config/routes.rb
get 'articles/:slug', to: 'articles#show', as: :article_with_slug

并使用它:

# app/controllers/articles_controller.rb
def create
  @article = Article.new(article_params)
  if @article.save!
    redirect_to article_with_slug(slug: @article.slug) 
  else
    render :new
  end
end

答案 1 :(得分:1)

您可以覆盖Article#to_param方法,也可以使用更明确的重定向目标(推荐)。

取代:

redirect_to @article

使用:

redirect_to article_path(@article.slug)
# or:
redirect_to article_path(slug: @article.slug)

to_param方法将改变模型在Rails中的行为方式,如果您希望能够将记录直接传递给form_for(以及其他构建器),则可能需要这样做。 /> 您可以override it at the instance level,也可以使用the class level helper