Friendly_id 由于 before_action 阻止了 edit/new 个页面:find_post
Friendly_id preventing edit/new pages due to before_action :find_post
我正在使用 friendly_id gem 来处理 URL Slugs 并且在应用修复程序以避免 404 当 slug 从 documentation 发生变化时,我的代码没有无法正常工作。
问题是,当我点击编辑按钮时,它只是重定向到 post 的显示视图,不会让我创建一个新的 post,因为它 "can't find post with ID..." 因为它使用的是 find_post
方法。
我也有 friendly_id_slugs
table 来存储历史记录。
在我的 Post 模型中:
class Post < ApplicationRecord
extend FriendlyId
friendly_id :title, use: :slugged
...
def should_generate_new_friendly_id?
slug.nil? || title_changed?
end
end
Post 控制器:
class PostsController < ApplicationController
before_action :find_post
...
def find_post
@post = Post.friendly.find(params[:id])
# If an old id or a numeric id was used to find the record, then
# the request path will not match the post_path, and we should do
# a 301 redirect that uses the current friendly id.
if request.path != post_path(@post)
return redirect_to @post, :status => :moved_permanently
end
end
end
我试过使用 before_filter
但问我是不是 before_action
并且我在 public 和 [=21] 中都尝试了 find_post
方法=] 我的控制器部分。
在我看来,除了 show
操作之外,您可能希望跳过该重定向逻辑,因为 redirect_to @post
只会将您发送到表演路线。
def find_post
@post = Post.find params[:id]
if action_name == 'show' && request.path != post_path(@post)
return redirect_to @post, :status => :moved_permanently
end
end
或者,您可以使用如下方式将重定向行为与 post 的预加载分离:
before_action :find_post
before_action :redirect_to_canonical_route, only: :show
def find_post
@post = Post.find params[:id]
end
def redirect_to_canonical_route
if request.path != post_path(@post)
return redirect_to @post, :status => :moved_permanently
end
end
我正在使用 friendly_id gem 来处理 URL Slugs 并且在应用修复程序以避免 404 当 slug 从 documentation 发生变化时,我的代码没有无法正常工作。
问题是,当我点击编辑按钮时,它只是重定向到 post 的显示视图,不会让我创建一个新的 post,因为它 "can't find post with ID..." 因为它使用的是 find_post
方法。
我也有 friendly_id_slugs
table 来存储历史记录。
在我的 Post 模型中:
class Post < ApplicationRecord
extend FriendlyId
friendly_id :title, use: :slugged
...
def should_generate_new_friendly_id?
slug.nil? || title_changed?
end
end
Post 控制器:
class PostsController < ApplicationController
before_action :find_post
...
def find_post
@post = Post.friendly.find(params[:id])
# If an old id or a numeric id was used to find the record, then
# the request path will not match the post_path, and we should do
# a 301 redirect that uses the current friendly id.
if request.path != post_path(@post)
return redirect_to @post, :status => :moved_permanently
end
end
end
我试过使用 before_filter
但问我是不是 before_action
并且我在 public 和 [=21] 中都尝试了 find_post
方法=] 我的控制器部分。
在我看来,除了 show
操作之外,您可能希望跳过该重定向逻辑,因为 redirect_to @post
只会将您发送到表演路线。
def find_post
@post = Post.find params[:id]
if action_name == 'show' && request.path != post_path(@post)
return redirect_to @post, :status => :moved_permanently
end
end
或者,您可以使用如下方式将重定向行为与 post 的预加载分离:
before_action :find_post
before_action :redirect_to_canonical_route, only: :show
def find_post
@post = Post.find params[:id]
end
def redirect_to_canonical_route
if request.path != post_path(@post)
return redirect_to @post, :status => :moved_permanently
end
end