gpt4 book ai didi

ruby-on-rails - 如何使用基于 :id? 的 RoR 更改页面标题

转载 作者:数据小太阳 更新时间:2023-10-29 09:02:26 26 4
gpt4 key购买 nike

我有一个用 Ruby on Rails(后端)和 React.js(前端)构建的网站,因此所有内容都是动态加载的,页面更改是通过 AJAX 实现的。如果用户正在浏览文章,我想将 html 页面标题更改为文章标题。因此,如果用户访问 website.com/discuss/14 ,我希望将页面标题更新为文章标题,其中 topic_id = 14。但是,如果用户访问 website.com/#contactpage 或任何其他页面不是一个讨论页面,那么应该有一个默认标题。

现在,我的代码仅适用于 SEO 的_escaped_fragment_,但不适用于普通用户。

这是代码:

--- frontend.html.erb

<!DOCTYPE html>
<html>
<head>

<% if params["_escaped_fragment_"].present? %>
<%= render partial: 'layouts/escaped_title' %>
<% elsif Rails.application.routes.recognize_path('discuss') %>
<%= render partial: 'layouts/discuss_title' %>
<% else %>
<title>website.com:default title</title>
<% end %>
.....rest of my page code

所以第一个条件(转义片段)工作得很好。这是失败的第二个条件(路线 ->讨论)。这是每个部分的代码:

---- _escaped_title.html.erb

<% if params[:_escaped_fragment_] %>
<% if params[:_escaped_fragment_].match(/\/discuss\/(\d+)/) %>
<% topic = Topic.statistic.find_by_id($1) %>
<% if topic %>
<% opts = {sector: true, statistic: true, background: true} %>
<% json = topic.show_data(opts) %>
<% plain_question = ActionView::Base.full_sanitizer.sanitize(topic.question) %>
<title><%= plain_question %> - on website.com</title>

<% end %>
<% end %>
<% end %>

---- _discuss_title.html.erb

<% topic = Topic.find_by_id(params[:id]) %>
<% if topic %>
<% opts = {sector: true, statistic: true, background: true} %>
<% json = topic.show_data(opts) %>
<% plain_question = ActionView::Base.full_sanitizer.sanitize(topic.question) %>
<title><%= plain_question %> - on website.com</title>
<% end %>

我怀疑我的 _discuss_title.html.erb 的前几行不正确,但我不知道如何正确执行。如何正确获取当前主题 ID 并将其传递给变量以供其搜索我的数据库?

非常感谢!

最佳答案

首先通过创建辅助方法来简化您的 View :

module ApplicationHelper
def title
content_tag(:title, @title || "Some default title")
end
end

它是这样使用的:

<!DOCTYPE html>
<html>
<head>
<%= title %>
</head>

我们现在已经将复杂性移出了 View ,我们可以通过设置 View 上下文实例变量 @title 来控制页面标题。

实现这个最简单的方法是在实际需要自定义标题的 Controller 中实际设置标题:

class DiscussionController < ApplicationController

before_filter :set_discussion, only: [:show, :edit, :delete, :update]
before_filter :set_title, only: [:show], if: lambda{ |controller| controller.request.format.html? }

private

def set_discussion
@discussion = Discussion.find(params[:id])
end

def set_title
# since we get the value from the database record and
# not the params we don't need to worry about escaping.
@title = "Discussing article #{ @discussion.id }"
end
end

关于ruby-on-rails - 如何使用基于 :id? 的 RoR 更改页面标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021539/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com