分类
文章

如何为ruby on rails应用程序创建嵌套资源

介绍

Ruby on Rails是一个用Ruby编写的Web应用程序框架,为开发人员提供了一种自以为是的方法来进行应用程序开发。与Rails合作可为开发人员提供:

  • 处理路由,状态数据和资产管理之类的约定。
  • 牢固地扎根于model-view-controller (MCV)架构模式,该模型将位于模型中的应用程序逻辑与应用程序信息的表示和路由分开。

当您在Rails应用程序中增加复杂性时,您可能会使用多种模型,这些模型代表了应用程序的业务逻辑以及与数据库的接口。添加相关模型意味着在它们之间建立有意义的关系,这将影响信息如何通过应用程序的控制器进行中继以及如何通过视图将其捕获并呈现给用户。

在本教程中,您将基于现有的Rails应用程序,该应用程序向用户提供有关鲨鱼的事实。该应用程序已经具有用于处理鲨鱼数据的模型,但是您将为有关单个鲨鱼的帖子添加嵌套资源。这将使用户能够建立有关单个鲨鱼的广泛思想和观点。

先决条件

要遵循本教程,您将需要:

第1步-搭建嵌套模型

我们的应用程序将利用Active Record associationsSharkPost模型之间建立关系:帖子将属于特定的鲨鱼,每个鲨鱼可以有多个帖子。因此,我们的SharkPost模型将通过belongs_tohas_many关联进行关联。

以这种方式构建应用程序的第一步将是创建Post模型和相关资源。为此,我们可以使用rails generate scaffold命令,该命令将为我们提供模型, 数据库迁移以更改数据库架构,控制器,用于管理标准创建,读取,更新和删除 (CRUD)的全套视图)操作,以及用于局部,助手和测试的模板。我们将需要修改这些资源,但是使用scaffold命令将为我们节省一些时间和精力,因为它生成了可以用作起点的结构。

首先,请确保您位于在先决条件中创建的Rails项目的sharkapp目录中:

  • cd sharkapp

使用以下命令创建Post资源:

  • rails generate scaffold Post body:text shark:references

通过body:text ,我们告诉Rails在posts数据库表(映射到Post模型的表)中包含body字段。我们还包括:references关键字,它在SharkPost模型之间建立了关联。具体来说,这将确保将代表sharks数据库中每个鲨鱼条目的外键添加到posts数据库。

运行命令后,将看到输出确认Rails为应用程序生成的资源。在继续之前,您可以检查数据库迁移文件以查看模型与数据库表之间现在存在的关系。使用以下命令查看文件的内容,确保将您自己的迁移文件上的时间戳替换为此处显示的内容:

  • cat db/migrate/20190805132506_create_posts.rb

您将看到以下输出:

Outputclass CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.text :body
      t.references :shark, foreign_key: true
      t.timestamps
    end
  end
end

如您所见,该表包括一个用于显示鲨鱼外键的列。该密钥将采用model_name _id的形式,在本例中为shark _id

Rails在其他地方也建立了模型之间的关系。使用以下命令查看新生成的Post模型:

  • cat app/models/post.rb
Outputclass Post < ApplicationRecord
  belongs_to :shark
end

belongs_to关联在模型之间建立关系,在该模型中,声明模型的单个实例属于命名模型的单个实例。在我们的应用程序中,这意味着单个职位属于单个鲨鱼。

除了设置这种关系之外, rails generate scaffold命令还创建了帖子的路线和视图,就像在如何构建Ruby on Rails应用程序的 步骤3中为鲨鱼资源所做的一样。

这是一个有用的开始,但是我们需要为Shark模型配置一些其他路由并巩固Active Record关联,以便模型和路由之间的关系能够按需工作。

第2步-为父模型指定嵌套路由和关联

感谢rails generate scaffold命令中的:references关键字,Rails已经在我们的Post模型中设置了belongs_to关联,但是为了使该关系正常运行,我们还需要在我们的Shark模型中指定has_many关联。我们还需要更改Rails给我们的默认路由,以使post资源成为shark资源的孩子。

要将has_many关联添加到Shark模型, app/models/shark.rb使用nano或您喜欢的编辑器打开app/models/shark.rb :

  • nano app/models/shark.rb

将以下行添加到文件中以建立鲨鱼和职位之间的关系:

~/sharkapp/app/models/shark.rb
class Shark < ApplicationRecord
  has_many :posts
  validates :name, presence: true, uniqueness: true
  validates :facts, presence: true
end

值得考虑的一件事是,删除特定的鲨鱼后帖子会发生什么。我们可能不希望与删除的鲨鱼相关的帖子保留在数据库中。为确保在删除该鲨鱼后删除与该鲨鱼相关的所有帖子,我们可以在该关联中包括dependent选项。

将以下代码添加到文件中,以确保对给定鲨鱼的destroy动作将删除所有关联的帖子:

~/sharkapp/app/models/post.rb
class Shark < ApplicationRecord
  has_many :posts , dependent: :destroy
  validates :name, presence: true, uniqueness: true
  validates :facts, presence: true
end

完成这些更改后,保存并关闭文件。如果您使用的是nano ,则可以通过按CTRL+XY ,然后按ENTER来执行此操作。

接下来,打开您的config/routes.rb文件,以修改资源丰富的路由之间的关系:

  • nano config/routes.rb

当前,文件如下所示:

~/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :posts
  resources :sharks
  root 'sharks#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

当前的代码在我们的路线之间建立了独立的关系,而我们要表达的是鲨鱼及其相关职位之间的依存关系

让我们更新路由声明,使:sharks:posts的父级。更新文件中的代码,如下所示:

~/sharkapp/config/routes.rb
Rails.application.routes.draw do
  resources :sharks do
    resources :posts
  end
  root 'sharks#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

完成编辑后,保存并关闭文件。

完成这些更改后,您可以继续更新posts控制器。

第3步-更新Posts控制器

我们的模型之间的关联为我们提供了一些方法,可用于创建与特定鲨鱼相关的新发布实例。要使用这些方法,我们需要将它们添加到我们的posts控制器中。

打开posts控制器文件:

  • nano app/controllers/posts_controller.rb

当前,文件如下所示:

~/sharkapp/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]
  # GET /posts
  # GET /posts.json
  def index
    @posts = Post.all
  end
  # GET /posts/1
  # GET /posts/1.json
  def show
  end
  # GET /posts/new
  def new
    @post = Post.new
  end
  # GET /posts/1/edit
  def edit
  end
  # POST /posts
  # POST /posts.json
  def create
    @post = Post.new(post_params)
    respond_to do |format|
      if @post.save
        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render :show, status: :created, location: @post }
      else
        format.html { render :new }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end
  # PATCH/PUT /posts/1
  # PATCH/PUT /posts/1.json
  def update
    respond_to do |format|
      if @post.update(post_params)
        format.html { redirect_to @post, notice: 'Post was successfully updated.' }
        format.json { render :show, status: :ok, location: @post }
      else
        format.html { render :edit }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end
  # DELETE /posts/1
  # DELETE /posts/1.json
  def destroy
    @post.destroy
    respond_to do |format|
      format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
  private
    # Use callbacks to share common setup or constraints between actions.
    def set_post
      @post = Post.find(params[:id])
    end
    # Never trust parameters from the scary internet, only allow the white list through.
    def post_params
      params.require(:post).permit(:body, :shark_id)
    end
end

就像我们的sharks控制器一样,该控制器的方法也可以与关联的Post类的实例一起使用。例如, new方法创建Post类的新实例, index方法获取该类的所有实例,而set_post方法使用findparams通过id选择特定的post。但是,如果我们希望将post实例与特定的shark实例关联,则将需要修改此代码,因为Post类当前作为独立实体运行。

我们的修改将利用两件事:

  • 当我们在模型中添加belongs_tohas_many关联时,这些方法就可以使用了。具体来说,由于在Shark模型中定义了has_many关联,我们现在可以访问build方法 。这种方法将使我们能够使用posts数据库中存在的shark_id外键创建与特定的shark对象关联的帖子对象的集合。
  • 当我们创建嵌套的posts路线时,这些路线和路线帮助器可用。有关在资源之间创建嵌套关系时可用的示例路由的完整列表,请参见Rails文档 。现在,对于我们来说,对于每个特定的鲨鱼(例如sharks/ 1 )而言,对于与该鲨鱼相关的帖子,都会有一条关联的路线: sharks/ 1 /posts 。还会有诸如shark_posts_path(@shark)edit_sharks_posts_path(@shark)类的路由助手,它们引用了这些嵌套的路由。

在文件中,我们将从编写方法get_shark开始,该方法将在控制器中的每个操作之前运行。该方法将通过shark_id查找一个shark实例, shark_id创建一个本地@shark实例变量。有了文件中可用的此变量,就可以通过其他方法将帖子与特定的鲨鱼相关联。

在文件底部的其他private方法之上,添加以下方法:

~/sharkapp/controllers/posts_controller.rb
. . .
private
  def get_shark
    @shark = Shark.find(params[:shark_id])
  end
  # Use callbacks to share common setup or constraints between actions.
. . .

接下来,在现有过滤器之前,将相应的过滤器添加到文件top :

~/sharkapp/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :get_shark

这将确保get_shark在文件中定义的每个操作之前运行。

接下来,您可以使用此@shark实例重写index方法。我们希望此方法返回与特定的shark实例关联的所有post实例,而不是获取Post类的所有实例。

修改index方法,如下所示:

~/sharkapp/controllers/posts_controller.rb
. . .
  def index
    @posts = @shark.posts
  end
. . .

new方法将需要进行类似的修订,因为我们希望将新的post实例与特定的鲨鱼相关联。为此,我们可以使用build方法以及本地@shark实例变量。

new方法更改为如下所示:

~/sharkapp/controllers/posts_controller.rb
. . .
  def new
    @post = @shark.posts.build
  end
. . .

此方法从get_shark方法创建与特定鲨鱼实例相关联的post对象。

接下来,我们将解决与new最紧密的方法: createcreate方法有两件事:使用用户输入到new表单中的参数构建一个新的post实例;如果没有错误,它将保存该实例并使用路由助手将用户重定向到他们可以看到的位置新职位。出现错误时,它将再次呈现new模板。

更新create方法,如下所示:

~/sharkapp/controllers/posts_controller.rb
  def create
    @post = @shark.posts.build(post_params)
        respond_to do |format|
         if @post.save
            format.html { redirect_to shark_posts_path(@shark), notice: 'Post was successfully created.' }
            format.json { render :show, status: :created, location: @post }
         else
            format.html { render :new }
            format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

接下来,看看update方法。此方法使用@post实例变量,该变量未在方法本身中显式设置。这个变量来自哪里?

查看文件顶部的过滤器。第二个自动生成的before_action过滤器提供了一个答案:

~/sharkapp/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :get_shark
  before_action :set_post, only: [:show, :edit, :update, :destroy]
  . . .

update方法(例如showeditdestroy )从set_post方法中获取一个@post变量。该方法与其他private方法一起列在get_shark方法下,目前看起来像这样:

~/sharkapp/controllers/posts_controller.rb
. . .
private
. . .
  def set_post
    @post = Post.find(params[:id])
  end
. . .

为了与文件中其他位置使用的方法保持一致,我们将需要修改此方法,以便@post引用与特定鲨鱼相关的帖子collection中的特定实例。在这里请牢记build方法-由于模型之间的关联以及借助这些关联对我们可用的方法(例如build ),我们的每个post实例都是与对象关联的对象集合的一部分特别是鲨鱼。因此有意义的是,当查询特定职位时,我们将查询与特定鲨鱼相关的职位集合。

更新set_post如下所示:

~/sharkapp/controllers/posts_controller.rb
. . .
private
. . .
  def set_post
    @post = @shark.posts.find(params[:id])
  end
. . .

我们不是通过id查找整个Post类的特定实例,而是在与特定鲨鱼相关的帖子集合中搜索匹配的id

更新该方法后,我们可以查看updatedestroy方法。

update方法利用的@post实例变量从set_post ,并与使用它post_params用户在已进入edit形式。在成功的情况下,我们希望Rails将用户带回到与特定鲨鱼相关的帖子的index视图。如果出现错误,Rails将再次渲染edit模板。

在这种情况下,我们唯一需要做的更改就是redirect_to语句,以处理成功的更新。更新它以重定向到shark_post_path(@shark) ,它将重定向到所选鲨鱼帖子的index视图:

~/sharkapp/controllers/posts_controller.rb
. . .
  def update
    respond_to do |format|
      if @post.update(post_params)
        format.html { redirect_to shark_post_path(@shark), notice: 'Post was successfully updated.' }
        format.json { render :show, status: :ok, location: @post }
      else
        format.html { render :edit }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end
. . .

接下来,我们将对destroy方法进行类似的更改。如果成功,请更新redirect_to方法以将请求重定向到shark_posts_path(@shark) :

~/sharkapp/controllers/posts_controller.rb
. . .
  def destroy
    @post.destroy
     respond_to do |format|
      format.html { redirect_to shark_posts_path(@shark), notice: 'Post was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
. . .

这是我们要做的最后更改。现在,您有一个posts控制器文件,如下所示:

~/sharkapp/controllers/posts_controller.rb
class PostsController < ApplicationController
  before_action :get_shark
  before_action :set_post, only: [:show, :edit, :update, :destroy]
  # GET /posts
  # GET /posts.json
  def index
    @posts = @shark.posts
  end
  # GET /posts/1
  # GET /posts/1.json
  def show
  end
  # GET /posts/new
  def new
    @post = @shark.posts.build
  end
  # GET /posts/1/edit
  def edit
  end
  # POST /posts
  # POST /posts.json
  def create
    @post = @shark.posts.build(post_params)
        respond_to do |format|
         if @post.save
            format.html { redirect_to shark_posts_path(@shark), notice: 'Post was successfully created.' }
            format.json { render :show, status: :created, location: @post }
         else
            format.html { render :new }
            format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end
  # PATCH/PUT /posts/1
  # PATCH/PUT /posts/1.json
  def update
    respond_to do |format|
      if @post.update(post_params)
        format.html { redirect_to shark_post_path(@shark), notice: 'Post was successfully updated.' }
        format.json { render :show, status: :ok, location: @post }
      else
        format.html { render :edit }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end
  # DELETE /posts/1
  # DELETE /posts/1.json
  def destroy
    @post.destroy
    respond_to do |format|
      format.html { redirect_to shark_posts_path(@shark), notice: 'Post was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
  private
   def get_shark
     @shark = Shark.find(params[:shark_id])
   end
    # Use callbacks to share common setup or constraints between actions.
    def set_post
      @post = @shark.posts.find(params[:id])
    end
    # Never trust parameters from the scary internet, only allow the white list through.
    def post_params
      params.require(:post).permit(:body, :shark_id)
    end
end

控制器管理如何将信息从视图模板传递到数据库,反之亦然。现在,我们的控制器反映了我们的SharkPost模型之间的关系,其中, Post与特定的Shark相关联。我们可以继续修改视图模板本身,在该模板中,用户将传递和修改有关特定鲨鱼的信息。

步骤4 —修改视图

我们对视图模板的修订将涉及更改与帖子相关的模板,并修改鲨鱼的show视图,因为我们希望用户看到与特定鲨鱼相关的帖子。

让我们从帖子的基础模板开始:跨多个帖子模板重用的form部分。立即打开该表格:

  • nano app/views/posts/_form.html.erb

不仅将post模型传递给form_with表单助手,我们还将传递sharkpost模型,并将post设置为子资源。

将文件的第一行更改为如下所示,以反映我们的鲨鱼资源和发布资源之间的关系:

~/sharkapp/views/posts/_form.html.erb
<%= form_with(model: [@shark, post], local: true) do |form| %>
. . .

接下来, delete列出相关鲨鱼的shark_id的部分,因为这不是视图中的基本信息。

完成的表单,包括我们对第一行的编辑,并且没有删除的shark_id部分,将如下所示:

~/sharkapp/views/posts/_form.html.erb
<%= form_with(model: [@shark, post], local: true) do |form| %>
  <% if post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2>
      <ul>
      <% post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <div class="field">
    <%= form.label :body %>
    <%= form.text_area :body %>
  </div>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

完成编辑后,保存并关闭文件。

接下来,打开index视图,该视图将显示与特定鲨鱼相关的帖子:

  • nano app/views/posts/index.html.erb

感谢rails generate scaffold命令,Rails生成了模板的更好部分,并带有一个表,该表显示了每个帖子的body字段及其相关的shark

与我们已经修改的其他代码非常相似,但是,当我们希望利用模型之间的关联以及这些关联提供给我们的集合和辅助方法时,此模板会将帖子视为独立实体。

在表格的主体中,进行以下更新:

首先,更新post.sharkpost.shark.name ,因此该表将包括相关的鲨鱼,而不是确定对鲨鱼对象本身信息的名称字段:

~/sharkapp/app/views/posts/index.html.erb
. . .
  <tbody>
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.body %></td>
        <td><%= post.shark.name %></td>
. . .

接下来,更改Show重定向以将用户定向到关联鲨鱼的show视图,因为他们极有可能想要一种导航回原始鲨鱼的方法。我们可以使用在此处在控制器中设置的@shark实例变量,因为Rails使在控制器中创建的实例变量可用于所有视图。我们还将链接的文本从Show更改为Show Shark ,以便用户更好地理解其功能。

将此行更新为以下内容:

~/sharkapp/app/views/posts/index.html.erb
. . .
  <tbody>
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.body %></td>
        <td><%= post.shark.name %></td>
        <td><%= link_to 'Show Shark', [@shark] %></td>

在下一行中,我们要确保用户在编辑帖子时被路由到正确的嵌套路径。是不是被引导到这意味着posts/ post_id /edit ,用户将被引导到sharks/ shark_id /posts/ post_id /edit 。为此,我们将使用shark_post_path路由帮助器和我们的模型,Rails会将其视为URL。我们还将更新链接文本,以使其功能更清晰。

更新” Edit行,使其如下所示:

~/sharkapp/app/views/posts/index.html.erb
. . .
  <tbody>
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.body %></td>
        <td><%= post.shark.name %></td>
        <td><%= link_to 'Show Shark', [@shark] %></td>
        <td><%= link_to 'Edit Post', edit_shark_post_path(@shark, post) %></td>

接下来,让我们对Destroy链接添加类似的更改,在字符串中更新其功能,并添加我们的sharkpost资源:

~/sharkapp/app/views/posts/index.html.erb
. . .
  <tbody>
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.body %></td>
        <td><%= post.shark.name %></td>
        <td><%= link_to 'Show Shark', [@shark] %></td>
        <td><%= link_to 'Edit Post', edit_shark_post_path(@shark, post) %></td>
        <td><%= link_to 'Destroy Post', [@shark, post], method: :delete, data: { confirm: 'Are you sure?' } %></td>

最后,在表单底部,我们将要更新” New Post路径,以在用户要创建新帖子时将其带到适当的嵌套路径。更新文件的最后一行以使用new_shark_post_path(@shark)路由助手:

~/sharkapp/app/views/posts/index.html.erb
. . .
<%= link_to 'New Post', new_shark_post_path(@shark) %>

完成的文件将如下所示:

~/sharkapp/app/views/posts/index.html.erb
<p id="notice"><%= notice %></p>
<h1>Posts</h1>
<table>
  <thead>
    <tr>
      <th>Body</th>
      <th>Shark</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.body %></td>
        <td><%= post.shark.name %></td>
        <td><%= link_to 'Show Shark', [@shark] %></td>
        <td><%= link_to 'Edit Post', edit_shark_post_path(@shark, post) %></td>
        <td><%= link_to 'Destroy Post', [@shark, post], method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>
<br>
<%= link_to 'New Post', new_shark_post_path(@shark) %>

完成编辑后,保存并关闭文件。

我们将要发布视图的其他编辑不会那么多,因为其他视图使用的是我们已经编辑过的局部form 。但是,我们将希望更新其他帖子模板中的link_to引用,以反映我们对form部分所做的更改。

打开app/views/posts/new.html.erb :

  • nano app/views/posts/new.html.erb

更新文件底部的link_to引用以使用shark_posts_path(@shark)帮助器:

~/sharkapp/app/views/posts/new.html.erb
. . .
<%= link_to 'Back', shark_posts_path(@shark) %>

完成更改后,保存并关闭文件。

接下来,打开edit模板:

  • nano app/views/posts/edit.html.erb

除了Back路径之外,我们还将更新Show以反映我们的嵌套资源。更改文件的最后两行,如下所示:

~/sharkapp/app/views/posts/edit.html.erb
. . .
<%= link_to 'Show', [@shark, @post] %> |
<%= link_to 'Back', shark_posts_path(@shark) %>

保存并关闭文件。

接下来,打开show模板:

  • nano app/views/posts/show.html.erb

对文件底部的EditBack路径进行以下编辑:

~/sharkapp/app/views/posts/edit.html.erb
. . .
<%= link_to 'Edit', edit_shark_post_path(@shark, @post) %> |
<%= link_to 'Back', shark_posts_path(@shark) %>

完成后保存并关闭文件。

最后一步,我们将要更新鲨鱼的show视图,以使各个鲨鱼的帖子可见。立即打开该文件:

  • nano app/views/sharks/show.html.erb

我们在此处的修改将包括在表单中Add Post Posts部分,并在文件底部Add Post链接。

在给定鲨鱼的Facts下方,我们将添加一个新节,该节遍历与该鲨鱼相关的帖子集合中的每个实例,并输出每个帖子的body

将以下代码添加到表单的” Facts部分下方,并在文件底部的重定向上方:

~/sharkapp/app/views/sharks/show.html.erb
. . .
<p>
  <strong>Facts:</strong>
  <%= @shark.facts %>
</p>
<h2>Posts</h2>
<% for post in @shark.posts %>
    <ul>
      <li><%= post.body %></li>
  </ul>
<% end %>
<%= link_to 'Edit', edit_shark_path(@shark) %> |
. . .

接下来,添加新的重定向,以允许用户为此特定鲨鱼添加新帖子:

~/sharkapp/app/views/sharks/show.html.erb
. . .
<%= link_to 'Edit', edit_shark_path(@shark) %> |
<%= link_to 'Add Post', shark_posts_path(@shark) %> |
<%= link_to 'Back', sharks_path %>

完成编辑后,保存并关闭文件。

现在,您已经对应用程序的模型,控制器和视图进行了更改,以确保帖子始终与特定的鲨鱼相关联。最后,我们可以向Post模型添加一些验证,以确保保存到数据库中的数据的一致性。

第5步—添加验证并测试应用程序

如何构建Ruby on Rails应用程序的 步骤5中,您向Shark模型添加了验证,以确保保存到sharks数据库中的数据的一致性和一致性。现在,我们将采取类似的步骤来确保对posts数据库的保证。

打开定义Post模型的文件:

  • nano app/models/post.rb

在这里,我们要确保帖子不为空白,并且不与其他用户可能发布的内容重复。为此,请将以下行添加到文件中:

~/sharkapp/app/models/post.rb
class Post < ApplicationRecord
  belongs_to :shark
  validates :body, presence: true, uniqueness: true
end

完成编辑后,保存并关闭文件。

有了最后的更改,您就可以运行迁移并测试应用程序。

首先,运行您的迁移:

  • rails db:migrate

接下来,启动服务器。如果您在本地工作,则可以通过运行以下命令进行操作:

  • rails s

如果在开发服务器上工作,请改为运行以下命令:

  • rails s --binding=your_server_ip

导航到应用程序的根目录,位于http://localhost:3000http:// your_server_ip :3000

前提Rails项目教程向您介绍了添加和编辑Great White Shark入口。如果您还没有添加任何其他Sharks,那么应用程序登录页面将如下所示:

Shark App 登陆页面

点击” Great White “名字旁边的” Show “。这将带您到此鲨鱼的show视图。您将看到Shark的名称及其事实,以及没有内容的Posts标头。让我们添加一个帖子来填充表单的这一部分。

单击” Posts标题下的” Add Post Posts 。这将带您到帖子index视图,在这里您可以选择New Post :

发布索引视图

由于您在如何构建Ruby on Rails应用程序的 步骤6中所采用的身份验证机制,可能会要求您使用在该步骤中创建的用户名和密码进行身份验证,这取决于您是否已创建新会话。 。

点击New Post ,这将带您进入new模板:

最新帖子

在” Body字段中,键入”这些鲨鱼很吓人!”

New Shark 发布

单击Create Post 。您将被重定向到属于该Shark的所有帖子的index视图:

成功后

通过工作后的资源,我们现在可以测试数据验证,以确保仅将所需数据保存到数据库中。

index视图中,点击New Post 。在Body的新形式的领域,尝试输入”这些鲨鱼是可怕的!”再次:

Shark 重发

单击Create Post 。您将看到以下错误:

独特的帖子错误

单击Back以返回到主要帖子页面。

要测试我们的其他验证,请再次单击” New Post 。将帖子保留为空白,然后单击Create Post 。您将看到以下错误:

空白帖子错误

在嵌套资源和验证正常运行的情况下,您现在拥有一个正常工作的Rails应用程序,可以将其用作进一步开发的起点。

结论

安装好Rails应用程序后,您现在可以进行样式设计和开发其他前端组件。如果您想了解有关路由和嵌套资源的更多信息, Rails文档是一个很好的起点。

要了解有关将前端框架与应用程序集成的更多信息,请查看如何使用React Frontend设置Ruby on Rails项目

发表评论

电子邮件地址不会被公开。 必填项已用*标注