FriendlyID 历史记录不适用于 Rails 中更新的模型 url
Posted
技术标签:
【中文标题】FriendlyID 历史记录不适用于 Rails 中更新的模型 url【英文标题】:FriendlyID history not working for updated model urls in Rails 【发布时间】:2014-12-28 10:29:19 【问题描述】:遵循 FriendlyID 的 wiki 和 railscast 如果我的用户模型的名称已更改,我尝试重写和重定向我的网址。不幸的是什么也没发生。我已经进行了正确的迁移:
rails generate friendly_id
rails generate migration add_slug_to_artists slug:string:uniq
rake db:migrate
并按照指示应用此代码,但无济于事。最初创建模型实例后,url 保持不变。
艺人模特
extend FriendlyId
friendly_id :name, use: [:slugged, :history]
用户控制器
class ArtistssController < ApplicationController
before_action :set_artist, only: [:show, :edit, :update, :destroy]
def show
if request.path != user_path(@artist)
redirect_to @artist, :status => :moved_permanently
end
end
def update
if @artist.update_attributes(artist_params)
flash[:notice] = 'Artist successfully updated'
redirect_to @artist
else
render 'edit'
end
private
# Use callbacks to share common setup or constraints between actions.
def set_artist
@artist = Artist.friendly.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def artist_params
params.require(:artist).permit(:name)
end
end
【问题讨论】:
您没有发布update
方法的代码,所以我不确定这是否是问题所在,但您需要将 slug
设置为 nil
以便它重新生成。
@ViniciusPinto 我已经更新了我的问题以显示更新操作中的内容(从脚手架生成的默认代码)。你会建议我做什么?
在调用update_attributes()
之前添加@artist.slug = nil
@ViniciusPinto 我的回答是否准确地符合您的描述?
【参考方案1】:
虽然它在他们的docs 中声明,但从未真正解释过在控制器中为 FriendlyID 5 更改 url 的代码。我最终不得不添加@artist.slug = nil
才能生效:
def update
@artist.slug = nil
if @artist.update_attributes(artist_params)
flash[:notice] = 'Artist successfully updated'
redirect_to @artist
else
render 'edit'
end
end
【讨论】:
@artist.slug = nil
应该在调用update_attributes
之前
奇怪的是,当 @artist.slug = nil
处于条件状态时,它仍然能够重写 url。不确定代码的正确位置,这就是为什么我想澄清并确保正确完成代码的原因。无论如何感谢您的帮助。以上是关于FriendlyID 历史记录不适用于 Rails 中更新的模型 url的主要内容,如果未能解决你的问题,请参考以下文章
使用 FriendlyID 在 Rails 中独立于标题编辑 slug