Jupyter AI

22 视图和模板:部分视图和布局

📅 发表日期: 2024年8月15日

分类: 🌟Rails 入门

👁️阅读: --

在 Ruby on Rails 中,视图和模板的设计是构建用户界面的重要组成部分。在前一篇中,我们介绍了如何使用 ERB 模板引擎来渲染视图。在本篇中,我们将深入探讨如何创建部分视图和布局,以提高代码的重用性和可维护性。

什么是部分视图?

部分视图(Partial)是用于将视图划分为更小、更可重用组件的视图。部分视图的主要目的是减少重复代码,并使代码结构更加清晰。你可以将一些可以共享的元素提取到单独的部分视图中,从而在不同的视图中重用它们。

创建部分视图

要创建部分视图,我们首先需要在视图目录中创建一个以下划线开头的文件,例如 _form.html.erb。下面是一个创建部分视图的步骤:

  1. 创建部分视图文件
    app/views/posts/ 目录下创建一个文件 _form.html.erb,这个部分视图将用于显示一个表单。

    <div class="post-form">
      <%= form_with model: @post do |form| %>
        <div class="form-group">
          <%= form.label :title %>
          <%= form.text_field :title, class: "form-control" %>
        </div>
        <div class="form-group">
          <%= form.label :content %>
          <%= form.text_area :content, class: "form-control" %>
        </div>
        <%= form.submit "提交", class: "btn btn-primary" %>
      <% end %>
    </div>
    
  2. 在主视图中渲染部分视图
    app/views/posts/new.html.erbapp/views/posts/edit.html.erb 中,我们可以使用 render 方法来引入这个部分视图,示例如下:

    <h1>创建新帖子</h1>
    <%= render 'form' %>
    
    <h1>编辑帖子</h1>
    <%= render 'form' %>
    

这种方式使得我们可以复用相同的表单代码,而不需要在每个视图中重复书写。

布局(Layouts)

布局是指在额外的视图外部添加的结构和样式。布局可以定义整个应用程序的页面框架,例如头部、脚部和导航菜单。每个视图都可以系统地使用相同的布局,从而提供一致的用户体验。

创建布局

在 Rails 中,布局文件通常位于 app/views/layouts 目录下。默认的布局文件是 application.html.erb。下面是一个简单的布局示例:

<!DOCTYPE html>
<html>
<head>
  <title>我的博客</title>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>
  
  <%= stylesheet_link_tag 'application', media: 'all' %>
  <%= javascript_pack_tag 'application' %>
</head>

<body>
  <header>
    <h1>我的博客</h1>
    <nav>
      <ul>
        <li><%= link_to '首页', root_path %></li>
        <li><%= link_to '创建帖子', new_post_path %></li>
      </ul>
    </nav>
  </header>

  <main>
    <%= yield %> <!-- 视图内容将在这里插入 -->
  </main>

  <footer>
    <p>&copy; <%= Time.now.year %> 我的博客</p>
  </footer>
</body>
</html>

在这个布局中,我们使用了 yield 关键字来指示在布局中插入的视图内容。每个视图都将会在 <main> 标签内展示。

使用布局

默认情况下,Rails 会使用 application.html.erb 作为所有视图的布局文件。如果你需要为特定的视图使用不同的布局,可以在控制器中指定。例如:

class PostsController < ApplicationController
  layout "special_layout", only: [:show]
  
  # 其他控制器代码...
end

在这个例子中,show 动作将使用名为 special_layout.html.erb 的布局文件,而其他动作将继续使用默认的布局文件。

案例结合

假设我们已经创建了一个 Posts 控制器,并在控制器中定义了 newedit 方法,来分别处理新帖子创建和帖子编辑的请求。现在,我们可以结合上述部分视图和布局的使用,来实现一个完整的功能。

class PostsController < ApplicationController
  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.save
      redirect_to @post, notice: '帖子创建成功!'
    else
      render :new
    end
  end
  
  def edit
    @post = Post.find(params[:id])
  end

  def update
    @post = Post.find(params[:id])
    if @post.update(post_params)
      redirect_to @post, notice: '帖子更新成功!'
    else
      render :edit
    end
  end

  private

  def post_params
    params.require(:post).permit(:title, :content)
  end
end

new.html.erbedit.html.erb 中,我们分别渲染了 _form.html.erb 部分视图,使用布局来提供页面的整体结构,从而实现了代码的组织和界面的一致性。

小结

在这一节中,我们探讨了如何使用部分视图和布局来构建更灵活、可重用的视图。在实际开发中,这种结构将有助于减少代码重复,提高维护性。在下一篇教程中,我们将继续研究如何处理表单,创建用户输入的表单以支持动态数据输入。

🌟Rails 入门 (滚动鼠标查看)