您当前的位置:首页产经 >  >> 
Rails 中的布局和渲染
来源:博客园      时间:2023-04-24 17:29:49
Templates, Partials, and Layouts

在 Rails 中,视图是用于呈现 HTML、XML、JSON 等响应的模板。Rails 的视图系统支持模板、局部模板和布局模板,它们分别用于分离代码、提高代码重用性和提供统一的外观。

模板是视图的基本构建块。模板可以包含 HTML、Ruby 代码和其他标记,以生成动态内容。在 Rails 中,模板通常存储在 app/views目录中,并使用文件扩展名 .html.erb.xml.builder.json.jbuilder等来表示相应的格式。

局部模板是一种特殊类型的模板,它可以在其他模板中重复使用。局部模板通常用于呈现通用的部分,例如页眉、页脚、导航栏等。在 Rails 中,局部模板通常存储在 app/views目录下的 partials子目录中,并使用前导下划线 _来表示。

布局模板是一种用于定义应用程序的外观和结构的模板。布局模板定义了应用程序的共同元素,例如页眉、页脚、导航栏等。在 Rails 中,布局模板通常存储在 app/views/layouts目录中,并使用文件扩展名 .html.erb.html.haml来表示。您可以在控制器中使用 layout方法来指定布局模板。例如,如果您想要使用名为 application.html.erb的布局模板,可以在控制器中使用以下代码:

class MyController < ApplicationController  layout "application"  # ...end

在这个例子中,layout方法告诉 Rails 使用名为 application.html.erb的布局模板来呈现该控制器的响应。

总之,Rails 的视图系统支持模板、局部模板和布局模板,它们分别用于分离代码、提高代码重用性和提供统一的外观。模板是视图的基本构建块,局部模板可以在其他模板中重复使用,布局模板用于定义应用程序的外观和结构。

Templates

在 Rails 中,视图是用于呈现 HTML、XML、JSON 等响应的模板。视图通常由一个控制器动作触发,该动作会渲染一个视图模板并将其作为响应发送给客户端。Rails 视图系统支持多种格式,例如 HTML、XML、JSON 等,并且可以使用不同的模板语言,例如 ERB、Haml、Slim 等。

视图模板通常存储在 app/views目录中,并使用文件扩展名 .html.erb.xml.builder.json.jbuilder等来表示相应的格式。模板文件包含了 HTML、Ruby 代码和其他标记,以生成动态内容。在模板中,您可以使用 Ruby 代码来访问控制器实例变量和辅助方法,并使用标记来生成 HTML 或其他格式的内容。

例如,以下是一个简单的 ERB 模板,用于显示用户的名称和电子邮件地址:

<%= @user.name %>

<%= @user.email %>

在这个例子中,模板使用 <%= %>标记来呈现 @user实例变量的值。渲染此模板后,将生成一个包含用户名称和电子邮件地址的 HTML 页面。

总之,视图是用于呈现 HTML、XML、JSON 等响应的模板。模板通常存储在 app/views目录中,并使用文件扩展名 .html.erb.xml.builder.json.jbuilder等来表示相应的格式。模板文件包含了 HTML、Ruby 代码和其他标记,以生成动态内容。在模板中,您可以使用 Ruby 代码来访问控制器实例变量和辅助方法,并使用标记来生成 HTML 或其他格式的内容。

Partials

Partials 是 Ruby on Rails 中的一个功能,它允许我们将视图代码分解成多个小块,以便更好地组织和重用。Partials 通常用于在视图中呈现重复的代码或组件,例如页眉、页脚、导航栏、表单等。

使用 Partials,我们可以将视图代码分解成多个文件,并在其他视图中包含它们。这样,我们就可以避免重复编写相同的代码,并使代码更加易于维护和更新。

以下是一个使用 Partials 的简单示例:

假设我们有一个显示博客文章的视图 show.html.erb,它包含一个标题、作者和内容。我们可以将这个视图分解成多个 Partials,如下所示:

# app/views/posts/_header.html.erb

<%= @post.title %>

<%= @post.author %>

# app/views/posts/_content.html.erb

<%= @post.content %>

# app/views/posts/show.html.erb<%= render "header" %><%= render "content" %>

在这个示例中,我们创建了两个 Partials _header.html.erb_content.html.erb,它们分别呈现文章的标题、作者和内容。在 show.html.erb视图中,我们使用 render方法包含这两个 Partials。

Rails 默认会在视图文件夹中查找以下划线开头的文件,并将它们视为 Partials。在我们的示例中,Rails 将自动查找 _header.html.erb_content.html.erb文件,并将它们呈现到 show.html.erb中。

使用 Partials,我们可以将视图代码分解成更小的块,并在需要时将它们组合在一起。这使得代码更加易于管理和重用,从而提高开发效率。

Partial Layouts

Partial Layouts 是 Ruby on Rails 中的一个功能,它允许我们在 Partial 中使用布局,并可以在需要时覆盖 Partial 中的布局。这种方式可以帮助我们更好地组织和重用视图代码,特别是对于一些带有共同布局的视图。

使用 Partial Layouts,我们可以将一个布局文件分解成多个 Partial,并在需要时组合在一起。这样可以使布局更加灵活和易于管理,从而提高开发效率。

以下是一个使用 Partial Layouts 的简单示例:

假设我们有一个显示博客文章的视图 show.html.erb,它包含一个标题、作者和内容。我们想要在这个视图中使用一个布局,其中包含一个页眉、一个页脚和一个内容区域。

我们可以将这个布局分解成多个 Partials,如下所示:

# app/views/layouts/_header.html.erb

My Blog

# app/views/layouts/_footer.html.erb

Copyright © 2023 My Blog

# app/views/layouts/_content.html.erb<%= yield %># app/views/layouts/application.html.erb<%= render "header" %><%= render "content" %><%= render "footer" %>

在这个示例中,我们创建了三个 Partials _header.html.erb_content.html.erb_footer.html.erb,它们分别呈现布局的页眉、内容和页脚。在 application.html.erb布局文件中,我们使用 render方法包含这三个 Partials,并使用 yield方法呈现视图模板中的内容。

如果我们想要覆盖某个 Partial 中的布局,可以在视图模板中使用 render方法并指定要覆盖的 Partial 的名称,如下所示:

# app/views/posts/show.html.erb<%= render partial: "content", layout: "my_custom_layout" %>

在这个示例中,我们在 show.html.erb视图模板中使用 render方法并指定要呈现的 Partial 的名称为 content,并且指定使用名为 my_custom_layout的 Partial Layouts。

Rails 将自动查找名为 _my_custom_layout.html.erb_my_custom_layout.html.haml的 Partial Layouts,并将其中包含的 _content.html.erbPartial 呈现到布局的内容区域中。

使用 Partial Layouts,我们可以更好地组织和重用视图代码,特别是对于一些带有共同布局的视图。这使得代码更加易于维护和更新,从而提高开发效率。

View Paths

View Paths 是 Ruby on Rails 中用来查找视图模板的一种机制。当我们在控制器中使用 render方法呈现视图时,Rails 将自动搜索视图模板,并将其呈现到浏览器中。

Rails 使用一组默认的 View Paths 来查找视图模板。这些 View Paths 包括应用程序视图目录、公共视图目录、引擎视图目录和插件视图目录等。我们也可以通过配置 View Paths 来添加自定义的视图目录。

以下是一个简单的示例,说明如何在 Rails 中配置 View Paths:

假设我们有一个名为 MyApp的 Rails 应用程序,其中包含一个控制器 PostsController和一个视图模板 show.html.erb。默认情况下,Rails 将在 app/views/posts/show.html.erb中查找视图模板。

如果我们想要添加一个自定义的视图目录,在其中包含视图模板,并让 Rails 在查找视图模板时搜索这个目录,可以在 config/application.rb文件中添加以下代码:

# config/application.rbmodule MyApp  class Application < Rails::Application    # 添加自定义的视图路径    config.paths.add "app/views/custom", :before => "app/views"  endend

在这个示例中,我们在 config/application.rb文件的 config.paths中添加了一个自定义的视图路径 app/views/custom:before => "app/views"参数表示我们希望这个路径优先于默认的视图路径。

这样一来,当我们在 PostsController中使用 render方法呈现视图时,Rails 将自动查找 app/views/custom/posts/show.html.erb视图模板,并将其呈现到浏览器中。

View Paths 是一种非常灵活和强大的机制,它使我们能够轻松地组织和管理视图模板,并且能够支持自定义的视图路径。这样一来,我们可以更好地组织和重用视图代码,从而提高开发效率。

如果您还没有创建您的 User模型和相应的控制器和视图,您需要按照以下步骤进行操作:

创建 User模型和相应的属性

使用 Rails 生成器创建一个 User模型,并添加 nameemail两个属性。您可以使用以下命令:

rails generate model User name:string email:string

这将在 app/models/user.rb文件中创建一个名为 User的模型,并在数据库中创建一个名为 users的表,其中包含 nameemail两个字符串类型的字段。

然后运行数据库迁移以创建 users表:

rails db:migrate
创建 UsersController控制器

接下来,您需要创建一个名为 UsersController的控制器,用于处理与用户相关的请求。使用以下命令创建控制器:

rails generate controller Users

这将在 app/controllers/users_controller.rb文件中创建一个名为 UsersController的控制器。在 UsersController中,您需要定义一个名为 show的动作来显示用户的信息。在 UsersController中添加以下代码:

class UsersController < ApplicationController  def show    @user = User.find(params[:id])  endend

该动作使用 User.find方法查找要显示的用户,并将其存储在一个名为 @user的实例变量中,以便在视图中使用。

创建 show视图

接下来,您需要创建一个名为 show.html.erb的视图文件,用于显示用户的信息。在 app/views/users目录中创建一个名为 show.html.erb的文件,并添加以下代码:

<%= @user.name %>

<%= @user.email %>

该视图使用 @user实例变量来显示用户的名称和电子邮件。

定义路由

最后,您需要定义一个路由,以便将请求路由到 UsersControllershow动作。在 config/routes.rb文件中添加以下代码:

Rails.application.routes.draw do  resources :usersend

这将定义一个名为 users的资源路由,该路由将处理与 User模型相关的请求。现在您可以通过访问 /users/:idURL 来访问 UsersControllershow动作,其中 :id是要显示的用户的 ID。

现在您可以启动 Rails 服务器并访问 http://localhost:3000/users/:id,其中 :id是要显示的用户的 ID,以查看用户的名称和电子邮件信息。

创建响应

从控制器的角度来看,可以通过三种方式创建 HTTP 响应:

调用render以创建完整响应以发送回浏览器调用redirect_to以向浏览器发送 HTTP 重定向状态代码调用head以创建仅包含 HTTP 标头的响应以发送回浏览器layout选项

在 Ruby on Rails 中,layout选项用于指定要用于呈现视图的布局文件。布局文件通常包含页面的共同元素,如页眉、页脚、导航栏等,可以在多个视图中重复使用,从而提高代码复用性和可维护性。

具体来说,如果你想在控制器方法中使用一个名为 application的布局文件来呈现视图,可以使用以下代码:

def show  @post = Post.find(params[:id])  render :show, layout: "application"end

在这个例子中,render :show表示要呈现名为 show的视图模板,而 layout: "application"表示要使用名为 application的布局文件来包装视图内容。控制器方法使用 render方法来呈现视图和布局,生成最终的响应。

如果不指定 layout选项,则默认使用名为 application的布局文件。如果你想在某个视图中禁用布局,可以使用 layout: false选项,如下所示:

def index  @posts = Post.all  render layout: falseend

在这个例子中,render layout: false表示不使用任何布局文件来呈现视图内容。控制器方法使用 render方法来呈现视图,生成最终的响应。

总之,layout选项可以方便地指定要用于呈现视图的布局文件,或者禁用布局。对于具有共同元素的页面,使用布局文件可以提高代码复用性和可维护性,从而更有效地开发应用程序。

status选项

在 Ruby on Rails 中,status选项是用于指定 HTTP 响应状态码的选项。HTTP 状态码是用于指示服务器对请求的处理结果的标准化代码,例如,200 表示请求成功,404 表示请求的资源不存在等等。

在控制器方法中,可以使用 render方法的 status选项来指定要返回的 HTTP 状态码。例如,下面的代码演示了如何在控制器方法中使用 status选项来返回 404 状态码:

def not_found  render plain: "404 Not Found", status: 404end

在这个例子中,render plain: "404 Not Found", status: 404表示要返回一个纯文本响应,内容为 "404 Not Found",并且状态码为 404。当客户端访问这个控制器方法时,服务器将返回一个带有 404 状态码的响应。

使用 status选项可以方便地指定要返回的 HTTP 状态码,从而更好地指示服务器对请求的处理结果。在实际应用中,通常会使用一些预定义的状态码,如 200、401、404、500 等等,以便客户端能够更好地理解服务器对请求的处理结果。

总之,在 Ruby on Rails 中,status选项是用于指定 HTTP 响应状态码的选项,通常与 render方法一起使用。它可以方便地指定要返回的状态码,以便更好地指示服务器对请求的处理结果。

formats选项

在 Ruby on Rails 中,formats选项是用于指定响应格式的选项。响应格式是指服务器返回给客户端的数据格式,例如 HTML、JSON、XML 等等。

在控制器方法中,可以使用 render方法的 formats选项来指定要返回的响应格式。例如,下面的代码演示了如何在控制器方法中使用 formats选项来返回 JSON 格式的响应:

def show  @user = User.find(params[:id])  render json: @user, formats: :jsonend

在这个例子中,render json: @user, formats: :json表示要返回一个 JSON 格式的响应,其中的 formats: :json选项指定了要返回的响应格式为 JSON。当客户端访问这个控制器方法时,服务器将返回一个包含用户数据的 JSON 格式的响应。

使用 formats选项可以方便地指定要返回的响应格式,以便服务器返回正确的数据格式。在实际应用中,通常会根据客户端的请求格式来动态地选择要返回的响应格式,从而提高应用的灵活性和可扩展性。

总之,在 Ruby on Rails 中,formats选项是用于指定响应格式的选项,通常与 render方法一起使用。它可以方便地指定要返回的响应格式,以便服务器返回正确的数据格式。

variants选项

在 Ruby on Rails 中,variants选项是用于指定响应变体的选项。响应变体是指根据客户端的请求属性(如语言、设备类型等)生成的不同版本的响应。

在控制器方法中,可以使用 respond_to方法的 variants选项来指定要生成的响应变体。例如,下面的代码演示了如何在控制器方法中使用 variants选项来生成适合不同设备类型的响应:

def index  @articles = Article.all  respond_to do |format|    format.html    format.json    format.turbo_stream    format.variant :phone do      render "index.phone"    end  endend

在这个例子中,respond_to方法包含了三种默认的响应格式(HTML、JSON 和 Turbo Stream),以及一个使用 variant选项生成的响应变体。当客户端通过手机访问这个控制器方法时,服务器将返回 index.phone视图模板对应的 HTML 响应。

使用 variants选项可以方便地为不同设备类型生成适合的响应,并提供更好的用户体验。在实际应用中,通常会根据客户端的请求属性和应用的需求来动态地生成响应变体,从而提高应用的可用性和可扩展性。

总之,在 Ruby on Rails 中,variants选项是用于指定响应变体的选项,通常与 respond_to方法一起使用。它可以方便地为不同设备类型生成适合的响应,并提供更好的用户体验。

查找布局

在 Ruby on Rails 中,布局是用于组织视图模板的共享代码的机制。每个控制器都可以有一个默认布局,也可以在控制器方法中通过 layout方法指定使用特定的布局。

布局通常位于 app/views/layouts目录下,以 .html.erb.html.haml等格式的文件存在。当视图模板渲染时,布局文件会自动被加载,并将视图模板的内容嵌入其中指定的位置。

在查找布局时,Rails 会按照以下顺序搜索布局文件:

首先,Rails 将查找与控制器名称相同的布局文件。例如,如果当前控制器的名称为 PostsController,则 Rails 将查找名为 posts.html.erbposts.html.haml等格式的布局文件。

如果没有找到与控制器名称相同的布局文件,则 Rails 将查找名为 application.html.erbapplication.html.haml等格式的布局文件。这是默认的布局文件,适用于所有控制器和视图。

如果以上两种情况都没有找到布局文件,则 Rails 将不使用布局,直接将视图模板的内容返回给客户端。

在控制器方法中,可以使用 layout方法来指定要使用的布局文件。例如,下面的代码演示了如何在控制器方法中使用 layout方法来指定要使用名为 admin的布局文件:

class Admin::UsersController < ApplicationController  layout "admin"  def index    # ...  endend

在这个例子中,layout "admin"表示要使用名为 admin的布局文件来渲染该控制器方法对应的视图模板。

总之,在 Ruby on Rails 中,布局是用于组织视图模板的共享代码的机制。Rails 会按照一定顺序查找布局文件,并自动将视图模板的内容嵌入其中指定的位置。可以使用 layout方法来指定要使用的布局文件。

为控制器指定布局

在 Ruby on Rails 中,可以为控制器指定默认的布局,以便在渲染视图模板时自动应用该布局。默认情况下,Rails 会使用名为 application.html.erbapplication.html.haml的布局文件作为所有控制器的默认布局。

要为控制器指定不同的布局,可以在控制器类中使用 layout方法来指定要使用的布局文件。例如,假设我们有一个名为 PostsController的控制器,我们可以在该控制器中指定要使用的布局文件:

class PostsController < ApplicationController  layout "posts_layout"  def index    # ...  end  def show    # ...  endend

在这个例子中,layout "posts_layout"表示要使用名为 posts_layout的布局文件作为该控制器的默认布局。当该控制器的 indexshow方法渲染视图模板时,将自动应用该布局。

除了在控制器类中使用 layout方法指定默认布局外,还可以在控制器方法中使用 render方法的 layout选项来指定要使用的布局文件。例如,下面的代码演示了如何在控制器方法中使用 layout选项来指定要使用名为 dashboard_layout的布局文件:

def dashboard  @user = current_user  render layout: "dashboard_layout"end

在这个例子中,render layout: "dashboard_layout"表示要使用名为 dashboard_layout的布局文件来渲染该控制器方法对应的视图模板。

总之,在 Ruby on Rails 中,可以为控制器指定默认的布局,以便在渲染视图模板时自动应用该布局。可以在控制器类中使用 layout方法或在控制器方法中使用 render方法的 layout选项来指定要使用的布局文件。

在运行时选择布局

在 Ruby on Rails 中,可以在运行时根据应用程序的需求选择要使用的布局。这通常是根据用户的角色、设备类型或其他条件来动态选择布局的。

要在运行时选择布局,可以在控制器方法中使用 render方法的 layout选项,并将其设置为一个方法名或一个 lambda 表达式。例如,下面的代码演示了如何在控制器方法中使用 lambda 表达式来动态选择布局:

def show  @post = Post.find(params[:id])  render layout: -> {    if current_user.admin?      "admin_layout"    else      "application"    end  }end

在这个例子中,render layout: -> { ... }表示将 layout选项设置为一个 lambda 表达式,该 lambda 表达式根据当前用户是否为管理员来选择要使用的布局。如果当前用户是管理员,则使用名为 admin_layout的布局文件,否则使用默认的 application布局文件。

除了使用 lambda 表达式来动态选择布局外,还可以定义一个方法来执行相同的逻辑,并将其作为 layout选项的值。例如:

def show  @post = Post.find(params[:id])  render layout: choose_layoutendprivatedef choose_layout  if current_user.admin?    "admin_layout"  else    "application"  endend

在这个例子中,choose_layout方法根据当前用户是否为管理员来选择要使用的布局,并将其作为 layout选项的值传递给 render方法。

总之,在 Ruby on Rails 中,可以在运行时根据应用程序的需求选择要使用的布局。可以使用 lambda 表达式或定义一个方法来执行相应的逻辑,并将其作为 layout选项的值传递给 render方法。

布局继承

在 Ruby on Rails 中,布局可以通过继承来实现代码的重用和分离。这意味着一个布局可以继承另一个布局,并且子布局可以覆盖父布局中的内容或添加新的内容。

要实现布局继承,可以在布局文件中使用 yield方法来指定子视图模板嵌入布局中的位置。然后,在子视图模板中,可以使用 content_for方法来定义要嵌入到父布局中的内容。例如,假设我们有一个名为 application.html.erb的默认布局文件:

  My Application  <%= stylesheet_link_tag    "application", media: "all" %>  <%= javascript_include_tag "application" %>  <%= csrf_meta_tags %><%= yield %>

在这个例子中,yield方法表示子视图模板的内容将嵌入到 标签中。

现在,假设我们想要为特定的控制器或视图创建一个自定义布局,并从默认布局中继承一些内容。我们可以创建一个名为 posts.html.erb的布局文件,并在其中指定要继承的布局文件,如下所示:

<% content_for :head do %>  <% end %><% content_for :content do %>  <%= yield %><% end %><%= render template: "layouts/application" %>

在这个例子中,content_for方法表示要嵌入到父布局中的内容。我们定义了两个 content_for块,一个用于添加自定义的 标签到 中,另一个用于嵌入子视图模板的内容。然后,我们使用 render方法来渲染默认的 application.html.erb布局,并将其包含在子布局中。

通过这种方式,我们可以创建一个自定义布局,并从默认布局中继承一些内容。在子视图模板中,我们可以使用 content_for方法来添加要嵌入到父布局中的内容。

总之,在 Ruby on Rails 中,可以使用布局继承来实现代码的重用和分离。可以在布局文件中使用 yield方法来指定子视图模板嵌入布局中的位置,并在子视图模板中使用 content_for方法来定义要嵌入到父布局中的内容。

假设你有一个名为“应用程序”的 Ruby on Rails 应用程序,并且你想要创建一个包含头部和脚部的默认布局,以及一个特定于“欢迎”页面的子布局。你可以按照以下步骤进行操作:

创建默认布局文件 app/views/layouts/application.html.erb,并将所有共同部分放在其中:
  应用程序

应用程序

<%= yield %>

© 2023 应用程序

在这个例子中,yield方法表示子视图模板的内容将嵌入到

标签中。

创建一个特定于“欢迎”页面的子布局文件 app/views/layouts/welcome.html.erb,并继承默认布局文件,并使用 content_for方法添加特定于子布局的内容:
<% content_for :title do %>    欢迎 - 应用程序<% end %><% content_for :main do %>    

欢迎来到应用程序!

这是一个演示 Ruby on Rails 应用程序。

<% end %><%= render template: "layouts/application" %>

在这个例子中,我们使用 content_for方法分别定义了 :title:main块,用于添加特定于子布局的标题和欢迎信息。然后,我们使用 render方法来渲染默认的 application.html.erb布局,并将其包含在子布局中。

创建一个特定于“欢迎”页面的视图文件 app/views/welcome/index.html.erb,并使用 content_for方法填充子布局中的块:
<% content_for :main do %>    

欢迎来到应用程序!

这是一个演示 Ruby on Rails 应用程序。

这是欢迎页面的内容。

<% end %>

在这个例子中,我们使用 content_for方法在视图文件中填充了子布局中的 :main块,添加了欢迎页面的内容。

通过这样的方式,你可以创建一个具有共同部分的默认布局,并从中继承特定于页面的子布局,并在视图文件中填充子布局中的块。这样就可以实现代码的重用和分离。

模板继承

在 Rails 中,可以使用模板继承来避免重复的代码,并更好地组织视图。具体来说,你可以创建一个基础模板,包含网页的通用结构和元素,然后在其他模板中继承它并添加特定的内容。

以下是一个简单的例子,演示如何在 Rails 中使用模板继承:

首先,创建一个名为 application.html.erb的基础模板,如下所示:

  My App  <%= stylesheet_link_tag "application", media: "all" %>  <%= javascript_include_tag "application" %>  <%= csrf_meta_tags %>  

My App

<%= yield %>
© My App <%= Time.current.year %>

在这个例子中,基础模板包含一个顶部导航栏和一个底部版权信息,还包括一个名为 yield的占位符,用于在继承模板中插入内容。

接下来,创建一个名为 home.html.erb的继承模板,如下所示:

<% content_for :title do %>  Home<% end %>

Welcome to My App

This is the home page.

在这个例子中,继承模板包含一个标题和一些文本内容,它继承了基础模板并添加了特定的内容。

最后,创建一个名为 about.html.erb的继承模板,如下所示:

<% content_for :title do %>  About<% end %>

About My App

This is the about page.

在这个例子中,继承模板包含一个标题和一些文本内容,它也继承了基础模板并添加了特定的内容。

现在,在浏览器中访问这些页面时,Rails 将使用基础模板中的通用结构和元素,并使用继承模板中的特定内容来渲染页面。你还可以在继承模板中使用 content_for方法来定义标题和其他占位符,以便在基础模板中设置。

总之,在 Rails 中,使用模板继承可以帮助你更好地组织视图,避免重复的代码,并提高代码的可维护性。

使用redirect_to

在 Rails 中,redirect_to方法用于将用户重定向到另一个 URL。它通常用于在控制器动作中执行一些操作后,将用户重定向到不同的页面。以下是一个简单的例子:

class UsersController < ApplicationController  def create    @user = User.new(user_params)    if @user.save      redirect_to @user    else      render "new"    end  endend

在这个例子中,create动作创建一个新的用户,并尝试将其保存到数据库中。如果保存成功,用户将被重定向到用户详情页面。如果保存失败,用户将被重定向回用户创建页面。

redirect_to方法可以接受多种参数,包括 URL、路径、路由助手、模型实例等。下面是一些常见的用法:

重定向到 URL:
redirect_to "https://www.example.com"
重定向到路径:
redirect_to "/users"
重定向到路由助手:
redirect_to users_path
重定向到模型实例:
redirect_to @user

在这个例子中,Rails 将使用 user_path(@user)路由助手生成用户详情页面的 URL。

除了指定重定向目标外,redirect_to方法还可以接受可选参数,用于指定重定向的类型、状态码、提示信息等。例如:

redirect_to @user, notice: "User was successfully created."

在这个例子中,Rails 将使用 user_path(@user)路由助手生成用户详情页面的 URL,并将一个名为 "notice" 的参数传递给目标页面。

总之,在 Rails 中,redirect_to方法是一个非常有用的工具,可以帮助你将用户重定向到不同的页面,并传递相关信息。

获取不同的重定向状态码

在 Rails 中,redirect_to方法默认使用 302 Found 状态码进行重定向,这意味着重定向的页面是暂时性的,并且浏览器会向新的页面发出 GET 请求。但是,有时候你可能需要使用不同的重定向状态码,以便更好地控制重定向行为。

以下是一些常见的重定向状态码和它们的含义:

301 Moved Permanently:指示请求的资源已永久移动到新位置,以后应该使用新的 URL。302 Found (默认值):指示请求的资源已暂时移动到新位置,浏览器应该使用新的 URL 进行请求。303 See Other:指示请求的资源可以在另一个 URL 中找到,应该使用 GET 方法进行请求。307 Temporary Redirect:指示请求的资源已暂时移动到新位置,浏览器应该使用原始请求的方式进行请求。308 Permanent Redirect:指示请求的资源已永久移动到新位置,以后应该使用新的 URL。

要使用不同的重定向状态码,可以将状态码作为 redirect_to方法的第二个参数传递。例如,要使用 301 Moved Permanently 状态码进行重定向,可以这样写:

redirect_to new_url, status: 301

在这个例子中,new_url是你要重定向到的新 URL,而 status: 301则表示要使用 301 Moved Permanently 状态码进行重定向。

除了使用数字状态码之外,Rails 还提供了一些常量,可以更方便地指定常见的状态码。例如,要使用 303 See Other 状态码进行重定向,可以这样写:

redirect_to new_url, status: :see_other

在这个例子中,:see_other是一个常量,表示 303 See Other 状态码。

总之,在 Rails 中,使用不同的重定向状态码可以帮助你更好地控制重定向行为,并提高用户体验。

render和的区别redirect_to

renderredirect_to是 Rails 中两个常用的控制器方法,它们都用于返回响应给用户,但是它们的作用和用法有所不同。

render方法用于渲染视图模板,并将其作为响应发送给用户。它通常在控制器动作中执行一些操作后,将结果呈现给用户。例如:

def show  @user = User.find(params[:id])  render :showend

在这个例子中,show动作查询一个用户,并将其赋值给 @user变量。然后,它通过 render方法将 show.html.erb视图模板渲染成 HTML,最终将其作为响应发送给用户。

redirect_to方法用于将用户重定向到另一个 URL。它通常在控制器动作中执行一些操作后,将用户重定向到不同的页面。例如:

def create  @user = User.new(user_params)  if @user.save    redirect_to @user  else    render :new  endend

在这个例子中,create动作创建一个新的用户,并尝试将其保存到数据库中。如果保存成功,用户将被重定向到用户详情页面。如果保存失败,用户将被重定向回用户创建页面。

因此,renderredirect_to的主要区别在于它们的作用和用法不同。render用于呈现视图,而 redirect_to用于将用户重定向到不同的页面。在使用它们时,你需要根据你的需求选择正确的方法,以便实现你的业务逻辑。

用于head构建仅标头响应

在 Rails 中,可以使用 head方法来构建仅包含标头的响应。这个方法常常用于在控制器中处理 AJAX 请求或者其他需要返回空响应的场景中。

head方法接受两个参数:第一个参数表示响应的状态码,第二个参数表示响应的标头。如果不需要设置标头,第二个参数可以省略。例如,要返回一个 200 OK 状态码的空响应,可以这样写:

head :ok

在这个例子中,head方法构建了一个只包含状态码的响应,并将其发送给客户端。

除了 :okhead方法还支持其他常见的状态码,例如 :created:unprocessable_entity:not_found等等。你也可以使用数字状态码来构建响应,例如 head 404表示返回一个 404 Not Found 状态码的响应。

如果你需要设置标头,可以将标头信息作为哈希参数传递给 head方法。例如,要返回一个包含自定义标头的 200 OK 响应,可以这样写:

head :ok, "X-Request-Id" => "123"

在这个例子中,第二个参数是一个哈希,它包含一个名为 X-Request-Id的自定义标头。当客户端收到响应时,它将包含这个自定义标头。

总之,head方法是一个快速简便的方法,用于构建仅包含标头的响应。在处理 AJAX 请求或其他需要返回空响应的场景中,它非常有用。

结构布局

在 Rails 中,结构布局(Stuctured Layouts)是一种常用的组织视图模板的方式。与传统的布局不同,结构布局使用嵌套的视图模板来组织页面内容,这样可以更灵活地构建复杂的页面。

结构布局基于以下两个核心概念:

yield方法:用于在布局中插入视图模板的内容。

content_for方法:用于在视图模板中定义可以在布局中使用的内容块。

通过这两个方法的结合使用,可以实现在布局和视图模板之间更加灵活的组织方式。

下面是一个简单的例子,展示了如何创建一个包含结构布局的 Rails 应用:

首先,在 app/views/layouts目录下创建一个名为 application.html.erb的文件,用于定义应用程序的默认布局。这个文件通常包含一个 HTML 头部和尾部,以及一个 yield方法,用于插入视图模板的内容:
      My App        <%= yield %>  
然后,在视图模板中,可以使用 content_for方法定义一个或多个内容块,例如:
<% content_for :sidebar do %>  

My Sidebar

This is my awesome sidebar.

<% end %>

My Page

This is my awesome page.

在这个例子中,content_for :sidebar定义了一个名为 :sidebar的内容块,其中包含一个标题和一些文本内容。<%= yield %>将会在应用布局中插入这个内容块。

最后,在布局中,可以使用 yield方法来插入视图模板的内容,并使用 content_for方法来插入视图模板中定义的内容块,例如:
      My App            
<%= yield %>

在这个例子中,布局将视图模板的内容插入到一个名为 :content的内容块中,并使用 content_for?(:sidebar)来检查视图模板中是否定义了 :sidebar的内容块。如果存在,布局将使用 yield(:sidebar)将其插入到布局中的侧边栏区域中。

总之,结构布局是一种灵活的组织视图模板的方式,在构建复杂的页面时非常有用。通过使用 yieldcontent_for方法,可以更加灵活地组织页面内容,并将布局和视图模板分离开来,使应用程序更具可维护性和可扩展性。

这里是几个常用的 Rails 辅助方法,用于在视图模板中生成 HTML 标签:

auto_discovery_link_tag:用于在 HTML 页面头部添加自动发现链接标签,以便浏览器可以自动发现页面的 RSS 或 Atom 提要auto_discovery_link_tag是一个 Rails 辅助方法,用于在 HTML 页面头部添加自动发现链接标签,以便浏览器可以自动发现页面的 RSS 或 Atom 提要。这个方法通常在布局文件中使用,以便将自动发现链接标签添加到每个页面的头部。

在 Rails 中,可以使用以下方式来使用 auto_discovery_link_tag

<%= auto_discovery_link_tag(:rss, feed_url) %><%= auto_discovery_link_tag(:atom, feed_url) %>

在这个例子中,auto_discovery_link_tag接受两个参数。第一个参数表示提要的类型,可以是 :rss:atom。第二个参数表示提要的 URL,通常是一个指向包含提要内容的 URL。

当这个方法被调用时,它会生成一个自动发现链接标签,并将其添加到页面头部。例如,如果你在布局文件中添加了这两行代码,并且 feed_url变量包含了一个指向你的 RSS 或 Atom 提要的 URL,那么 Rails 将会为每个页面添加下面这些标签:

这些标签告诉浏览器,页面包含一个或多个提要,并提供了一个指向提要内容的 URL。浏览器可以利用这些标签自动发现并订阅提要内容,使用户可以更方便地跟踪网站的更新。

总之,auto_discovery_link_tag是一个方便的 Rails 辅助方法,用于向 HTML 页面添加自动发现链接标签。在使用提要的网站中,这个方法可以提供更好的用户体验,使用户可以更方便地跟踪网站的更新。

javascript_include_tag:用于在 HTML 页面中引入 JavaScript 文件。可以接受一个或多个文件名作为参数,并生成对应的 <script>标签。例如:

<%= javascript_include_tag "application" %>

这个方法将会生成一个指向 app/assets/javascripts/application.js文件的 <script>标签。如果你需要引入多个文件,可以在参数中列出它们的文件名,例如:

<%= javascript_include_tag "jquery", "application" %>

这个方法将会生成两个 <script>标签,分别指向 app/assets/javascripts/jquery.jsapp/assets/javascripts/application.js文件。

stylesheet_link_tag:用于在 HTML 页面中引入 CSS 文件。与 javascript_include_tag类似,这个方法也可以接受一个或多个文件名作为参数,并生成对应的 标签。例如:
<%= stylesheet_link_tag "application" %>

这个方法将会生成一个指向 app/assets/stylesheets/application.css文件的 标签。如果你需要引入多个文件,可以在参数中列出它们的文件名,例如:

<%= stylesheet_link_tag "bootstrap", "application" %>

这个方法将会生成两个 标签,分别指向 app/assets/stylesheets/bootstrap.cssapp/assets/stylesheets/application.css文件。

image_tag:用于在 HTML 页面中插入图片。可以接受一个图片文件名作为参数,并生成对应的 标签。例如:
<%= image_tag "logo.png" %>

这个方法将会生成一个指向 app/assets/images/logo.png文件的 标签。如果需要设置其他属性,比如 altclass,可以在第二个参数中指定,例如:

<%= image_tag "logo.png", alt: "My Logo", class: "logo" %>
video_tag:用于在 HTML 页面中插入视频。可以接受一个视频文件名作为参数,并生成对应的 标签。例如:
<%= video_tag "my_video.mp4" %>

这个方法将会生成一个指向 app/assets/videos/my_video.mp4文件的 标签。如果需要设置其他属性,比如 controlsautoplay,可以在第二个参数中指定,例如:

<%= video_tag "my_video.mp4", controls: true, autoplay: true %>
audio_tag:用于在 HTML 页面中插入音频。可以接受一个音频文件名作为参数,并生成对应的 标签。例如:
<%= audio_tag "my_audio.mp3" %>

这个方法将会生成一个指向 app/assets/audios/my_audio.mp3文件的 标签。如果需要设置其他属性,比如 controlsautoplay,可以在第二个参数中指定,例如:

<%= audio_tag "my_audio.mp3", controls: true, autoplay: true %>

这些辅助方法是 Rails 非常常用的一部分,它们可以简化视图模板的开发,使开发者可以更方便地生成 HTML 标签。

理解yield

在 Ruby 中,yield是一个非常有用的关键字,可以用于将控制权传递给一个调用方法的代码块(block)。具体来说,当一个方法中包含了 yield关键字时,它会在执行过程中暂停并将控制权传递给调用者传递进来的代码块,然后等待代码块完成后再继续执行。

下面是一个简单的例子,用于说明如何使用 yield

def my_method  puts "Start of method"  yield  puts "End of method"endmy_method do  puts "Inside the block"end

在上面的例子中,my_method定义了一个代码块,其中包含了 yield关键字。当 my_method被调用时,它会执行前两行输出,然后将控制权传递给传递进来的代码块,在代码块中执行输出,然后返回 my_method继续执行最后一行输出。

因此,调用 my_method时将会输出:

Start of methodInside the blockEnd of method

这个例子只是 yield的一种使用方式。实际上,yield可以用于更复杂的情况下,例如传递参数,多次调用代码块等。在 Ruby 中,yield是一个非常强大的工具,可以帮助开发者写出更灵活、更可重用的代码。

使用content_for方法

content_for是 Rails 视图中非常有用的一个方法,它允许我们在视图中定义一个内容块,并在该块中填充任意内容。这样可以使视图文件更加灵活,从而使开发更加高效。

具体来说,content_for方法可以在视图文件中定义一个命名的内容块。例如:

# app/views/layouts/application.html.erb      <%= content_for?(:title) ? yield(:title) : "My App" %>        <%= yield %>  

在上面的代码中,我们定义了一个名为 title的内容块,并在 HTML 的 </code>标签中使用了该块。如果在视图文件中不使用 <code>content_for</code>填充 <code>title</code>块,则默认使用 "My App" 作为标题。</p><p>现在,我们可以在视图文件中调用 <code>content_for</code>方法来填充该块。例如:</p><pre><code class="language-ruby"># app/views/posts/index.html.erb<% content_for :title do %> My Blog<% end %><h1>Welcome to my blog!</h1></code></pre><p>在上面的代码中,我们在 <code>posts/index.html.erb</code>视图文件中使用 <code>content_for</code>来填充 <code>title</code>块。这样,视图文件中的 <code><title></code>标签将会被设置为 "My Blog"。</p><p><code>content_for</code>方法还可以用于填充其他内容块,例如页头、页脚、导航等。使用 <code>content_for</code>方法可以使视图文件更加灵活,从而使我们的 Rails 应用更加易于维护和扩展。</p> <div class="tags">标签: </div> </div> <div class="page_fenye"> </div> <div class="turn_Page"> <p>上一篇:<span><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11434.html" target="_blank">热点!house是什么意思啊_house是什么意思</a></span></p> <p>下一篇:<span><a href="javascript:alert('最后一页');" target="_blank">最后一页</a></span></p> </div> </div> <div class="recommend_part fl"> <div class="rec_tit"><a href="">为您推荐</a></div> <div class="double"> <ul class="pub_ul fl"> <li> <a href="http://www.jingji.sdqnw.net/licai/2022/0621/10228.html">力佳科技:北交所上市申报材料获上交所受理 保荐机构为长江证券</a> <span>2022-06-21</span> </li> <li> <a href="http://www.jingji.sdqnw.net/licai/2022/0621/10227.html">长川科技:收到深交所受理购买资产并募集配套资金申请文件</a> <span>2022-06-21</span> </li> <li> <a href="http://www.jingji.sdqnw.net/yinxing/2022/0620/10225.html">73.20%实现盈利!2021年支付机构财务稳健性大幅提升</a> <span>2022-06-20</span> </li> <li> <a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10222.html">(上海战疫录)沪鄂医护携手成功救治一名75岁合并多种疾病的新冠患者</a> <span>2022-05-20</span> </li> <li> <a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10221.html">福建森林消防野外驻训 从严从难检验训练成效</a> <span>2022-05-20</span> </li> </ul> <ul class="pub_ul fr"> <li> <a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10220.html">气温高降水多致三江源地区雷电灾害危险性较高</a> <span>2022-05-20</span> </li> <li> <a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10219.html">31省份累计报告接种新冠病毒疫苗336772.0万剂次</a> <span>2022-05-20</span> </li> <li> <a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10218.html">北京:农贸市场拟定期休市测环境核酸、彻底清洁消毒</a> <span>2022-05-20</span> </li> <li> <a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10217.html">青海湟中志愿者成功捐献造血干细胞</a> <span>2022-05-20</span> </li> <li> <a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10216.html">四川雅安:师生有序避震,无一人受伤</a> <span>2022-05-20</span> </li> </ul> </div> <ul class="tabs_ul active"> <li class="notImg"> <h1><a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10215.html" target="_blank">四川汉源4.8级地震:消防救援队伍解除地震灾害二级响应</a></h1> <p> 中新网成都5月20日电 (记者 刘忠俊)记者20日从四川省消防救援总队获悉,该总队已解除汉源4 8级地震灾害救援二级响应。 5月20日8时36分,四 <span class="."></span> </p> <div class="tabs_meta">来源:      时间:2022-05-20</div> </li> <li class="notImg"> <h1><a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10214.html" target="_blank">四川地震专家:汉源4.8级地震为走滑型地震</a></h1> <p> 中新网成都5月20日电 (记者 刘忠俊)记者20日从四川省地震局获悉,此次该省雅安市汉源县境内发生的4 8级地震为走滑型地震,震中位于汉源- <span class="."></span> </p> <div class="tabs_meta">来源:      时间:2022-05-20</div> </li> <li class="notImg"> <h1><a href="http://www.jingji.sdqnw.net/rongzi/2022/0520/10213.html" target="_blank">居家学习别忘情绪防“疫”</a></h1> <p> 作者:孙蔷蔷(中国教育科学研究院助理研究员) 近日,有媒体对1505名受访家长进行的一项调查显示,80%的受访家长表示孩子最近经历了居家学习 <span class="."></span> </p> <div class="tabs_meta">来源:      时间:2022-05-20</div> </li> <li class="notImg"> <h1><a href="http://www.jingji.sdqnw.net/gupiao/2022/0520/10212.html" target="_blank">上海一男子持刀划伤居委干部后自伤 目前两人均无生命危险</a></h1> <p> 5月20日8时,上海闵行公安分局接110报警称,老沪闵路某小区有人持刀伤人。民警迅速到场将肇事者闻某(男,64岁)控制。经查,闻某因纠纷持水 <span class="."></span> </p> <div class="tabs_meta">来源:      时间:2022-05-20</div> </li> <li class="notImg"> <h1><a href="http://www.jingji.sdqnw.net/gupiao/2022/0520/10211.html" target="_blank">上海虹口:5月20日至22日对全员开展三轮核酸筛查</a></h1> <p> 中新网5月20日电 据“上海虹口”微信公众号消息,上海虹口区新型冠状病毒肺炎疫情防控工作领导小组办公室20日发布《告虹口居民书》称,当 <span class="."></span> </p> <div class="tabs_meta">来源:      时间:2022-05-20</div> </li> </ul> </div> </div> <div class="list_right_part "> <div class="adversiment closed"> <p class="closead">X 关闭</p> </div> <div class="ad1"> <div class="ad_tit"> <h1><a href="http://www.jingji.sdqnw.net/chanjing/">产经</a></h1> </div> <div class="double_img"> <a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11434.html"><img alt="" src="http://img.9774.com.cn/2022/0923/20220923111909319.jpg"> <p>热点!house是什么意思啊_house是什么意思</p></a> <a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11433.html"><img alt="" src="http://img.dzwindows.com/2022/0610/20220610113230722.jpg"> <p>速读:智立方股东户数下降2.71%,户均持股15.15万元</p></a> </div> <ul> <li><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11435.html" target="_blank">Rails 中的布局和渲染</a></li> <li><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11432.html" target="_blank">每日热闻!人社部将制定网络招聘服务规范</a></li> <li><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11431.html" target="_blank">王纲球:复盘案例乙二醇2309合约的实战应用!_世界快播报</a></li> <li><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11430.html" target="_blank">父母离异后,子女拒绝赡养-热推荐</a></li> <li><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11429.html" target="_blank">我的鹅掌柴在冬天落叶_环球观速讯</a></li> <li><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11428.html" target="_blank">360倒车全景影像_倒车雷达和倒车影像哪个实用</a></li> <li><a href="http://www.jingji.sdqnw.net/chanjing/2023/0424/11427.html" target="_blank">2023WTT澳门冠军赛:王楚钦男单夺冠</a></li> </ul> </div> <div class="adversiment closed"> <p class="closead">X 关闭</p> </div> <div class="ad1"> <div class="ad_tit"> <h1><a href="http://www.jingji.sdqnw.net/yejie/">业界</a></h1> </div> <div class="ad1_text_con notImg"> <div> <a href="http://www.jingji.sdqnw.net/yejie/2022/0621/10226.html" target="_blank">4只科创板新股即将申购!超卓航科、凌云光、奥比中光等</a> <span>2022-06-21</span> </div> </div> <ul> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10019.html" target="_blank">上海虹口区已设243个采样点位 样本转运车助力构建15分钟核酸“采样圈”</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10018.html" target="_blank">中国科研团队提出云集“围攻”生物靶标智能纳米机器人模型</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10017.html" target="_blank">北京此轮疫情累报1282例感染者 各区疫情呈差异化分布</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10016.html" target="_blank">北京近日新增一起高校相关聚集性疫情</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10015.html" target="_blank">北京1地升级中风险 现在14地高风险29地中风险</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10014.html" target="_blank">湖南今年已拦截诈骗电话375万次 劝阻逾261万名潜在受害群众</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10013.html" target="_blank">5000余名河湖长守护水乡风光 浙江绍兴十年治水汇清流</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10012.html" target="_blank">江苏徐州吃出来的“狂欢节” 伏羊食俗晋级“国家队”</a></li> <li><a href="http://www.jingji.sdqnw.net/yejie/2022/0520/10011.html" target="_blank">北京新增本土感染者64例 其中社会面筛查2例</a></li> </ul> </div> <div class="ad1"> <div class="ad_tit"> <h1><a href="http://www.jingji.sdqnw.net/caijing/">财经</a></h1> </div> <div class="double_img"> <a href="http://www.jingji.sdqnw.net/caijing/2023/0117/10231.html"><img alt="" src="http://tuxianggu.4898.cn/thumb/uploads/2021-12-28/f8e3b09d67647a3e6a3aa9e0a59ae4f3.jpg"> <p>100万如何投资理财 如何在一天内赚一万元?</p></a> <a href="http://www.jingji.sdqnw.net/caijing/2022/0822/10229.html"><img alt="" src="http://tuxianggu.4898.cn/thumb/uploads/2020-11-02/5cdc2640d3fe50711eef22fe24898da4.jpg"> <p>关键核心技术获重大突破 北京经开区加速打造高精尖产业主阵地</p></a> </div> <div class="double_img"> <a href="http://www.jingji.sdqnw.net/caijing/2022/0520/10027.html"><img alt="" src="http://i2.chinanews.com.cn/simg/ypt/2022/220519/31939614-9bc6-484e-a4c1-385b94dd7099_zsite.jpeg"> <p>飞絮量减少90% 河北邯郸插瓶妙招治飞絮</p></a> </div> </div> <div class="ad1"> <div class="ad_tit"> <h1><a href="http://www.jingji.sdqnw.net/shanghui/">商会</a></h1> </div> <div class="news_ad1"> <a href="http://www.jingji.sdqnw.net/shanghui/2022/0520/10039.html"> <div class="ihg-ctr"><h1>专家:国内核酸检测试剂灵敏可靠 不受病毒变异影响<i></i></h1> <p> 中新网北京5月19日电 (记者 陈杭)北京市疾病预防控制中心副主任刘晓峰在19日召开的北京新冠肺炎疫情防控工作新闻发布会上表示,国内核酸<span class="more">[+更多]</span></p></div> </a> <a href="http://www.jingji.sdqnw.net/shanghui/2022/0520/10038.html"> <div class="ihg-ctr"><h1>北京封管控区实行“10+4”政策 有新增病例及阳性点位“一小区一策”<i></i></h1> <p> 中新网北京5月19日电 (记者 陈杭)北京新冠肺炎疫情防控工作领导小组社区防控组办公室负责人王大广在19日召开的北京新冠肺炎疫情防控工作<span class="more">[+更多]</span></p></div> </a> <a href="http://www.jingji.sdqnw.net/shanghui/2022/0520/10037.html"> <div class="ihg-ctr"><h1>北京丰台梳理岳各庄市场配送接货人员台账 严防疫情外溢传播<i></i></h1> <p> 中新网北京5月19日电 (记者 陈杭)北京市丰台区人民政府副区长孔钢城在19日召开的北京新冠肺炎疫情防控工作新闻发布会上表示,丰台区全面<span class="more">[+更多]</span></p></div> </a> <a href="http://www.jingji.sdqnw.net/shanghui/2022/0520/10036.html"> <div class="ihg-ctr"><h1>北京18日区域核酸筛查均为阴性 弹窗人员采样窗口1管十混一阳性<i></i></h1> <p> 中新网北京5月19日电 (记者 陈杭)北京市卫生健康委员会党委委员王小娥在19日召开的北京新冠肺炎疫情防控工作新闻发布会上表示,5月18日,<span class="more">[+更多]</span></p></div> </a> </div> </div> </div> </div> <!-- footer --> <footer id="footer"> <div class="container"> <div class="banquan"> <p>Copyright   2015-2022 青年经济网版权所有  备案号: <a href="https://beian.miit.gov.cn/" target="_blank">皖ICP备2022009963号-20</a>   联系邮箱:39 60 291 42@qq.com</p> </div> </div> </footer> <script> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp , s); })(); </script> <script charset="UTF-8" language="javascript" src="//data.dzxwnews.com/a.php"></script> <div class="goTop"></div> <script> let oimg = document.querySelectorAll('img'); for (var i = 0; i < oimg.length; i++) { oimg[i].setAttribute("onerror" , "this.src='http://www.jingji.sdqnw.net/static/images/notfound.jpg'") } </script> <script src="http://www.jingji.sdqnw.net/static/js/jquery.js"></script> <script src="http://www.jingji.sdqnw.net/static/js/index.js"></script> </body> </html>