欢迎光临
我们一直在努力

如何为Ruby on Rails应用程序创建嵌套资源

介绍

Ruby on Rails是一个用Ruby编写的Web应用程序框架,它为开发人员提供了一种应用程序开发的见解。 使用Rails为开发人员提供:

  • 用于处理路由,有状态数据和资产管理等内容的约定。
  • 模型 – 视图 – 控制器 (MCV)架构模式的坚实基础,它将位于模型中的应用程序逻辑与应用程序信息的表示和路由分开。

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

在本教程中,您将构建一个现有的Rails应用程序,该应用程序为用户提供有关鲨鱼的事实。 此应用程序已具有处理鲨鱼数据的模型,但您将为有关各个鲨鱼的帖子添加嵌套资源。 这将使用户能够建立更广泛的关于个体鲨鱼的想法和意见。

先决条件

要学习本教程,您需要:

第1步 – 支持嵌套模型

我们的应用程序将利用Active Record 关联建立SharkPost模型之间的关系:帖子将属于特定的鲨鱼,每个鲨鱼可以有多个帖子。 因此,我们的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数据库表中包含一个body字段 – 映射到Post模型的表。 我们还包括:references关键字,它设置SharkPost模型之间的关联。 具体来说,这将确保将表示sharks数据库中每个shark条目的外键添加到posts数据库中。

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

cat db/migrate/20190805132506_create_posts.rb

您将看到以下输出:

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

如您所见,该表包含一个鲨鱼外键列。 此密钥将采用model_name _id的形式 – 在我们的示例中为shark _id

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

cat app/models/post.rb
class Post < ApplicationRecord  belongs_to :sharkend

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为我们提供的默认路由,以便将资源作为鲨鱼资源的子项。

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

nano app/models/shark.rb

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

〜/ sharkapp /应用/模型/ shark.rb
class Shark < ApplicationRecord  has_many :posts  validates :name, presence: true, uniqueness: true  validates :facts, presence: trueend

这里值得思考的一件事是,一旦删除了特定的鲨鱼,帖子会发生什么。 我们可能不希望与删除的鲨鱼相关联的帖子在数据库中持久存在。 为了确保在删除该鲨鱼时消除与给定鲨鱼相关的任何帖子,我们可以在该关联中包含dependent选项。

将以下代码添加到文件中以确保给定shark上的destroy操作删除任何关联的帖子:

〜/ sharkapp /应用/模型/ post.rb
class Shark < ApplicationRecord  has_many :posts , dependent: :destroy  validates :name, presence: true, uniqueness: true  validates :facts, presence: trueend

完成这些更改后,保存并关闭文件。 如果您使用的是nano ,可以按CTRL+XY ,然后按ENTER

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

nano config/routes.rb

目前,该文件如下所示:

〜/ sharkapp /配置/ 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.htmlend

当我们想要表达的是鲨鱼与其相关帖子之间的依赖关系时,当前的代码在我们的路线之间建立了独立的关系。

让我们更新我们的路线声明:sharks的父母:posts 更新文件中的代码,如下所示:

〜/ sharkapp /配置/ 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.htmlend

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

有了这些更改,您可以继续更新您的posts控制器。

第3步 – 更新帖子控制器

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

打开posts控制器文件:

nano app/controllers/posts_controller.rb

目前,该文件如下所示:

〜/ sharkapp /控制器/ 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)    endend

像我们的鲨鱼控制器一样,这个控制器的方法可以处理相关Post类的实例。 例如, new方法创建Post类的新实例, index方法获取类的所有实例, set_post方法使用findparamsid选择特定的帖子。 但是,如果我们希望我们的post实例与特定的shark实例相关联,那么我们将需要修改此代码,因为Post类当前作为独立实体运行。

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

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

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

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

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

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

〜/ sharkapp /控制器/ posts_controller.rb
class PostsController < ApplicationController  before_action :get_shark

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

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

index方法修改为如下所示:

〜/ sharkapp /控制器/ posts_controller.rb
. . .  def index    @posts = @shark.posts  end. . .

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

new方法更改为如下所示:

〜/ sharkapp /控制器/ posts_controller.rb
. . .   def new    @post = @shark.posts.build  end. . . 

此方法创建一个与get_shark方法中的特定shark实例关联的post对象。

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

create方法更新为如下所示:

〜/ sharkapp /控制器/ 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 /控制器/ 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 /控制器/ posts_controller.rb
. . . private. . .   def set_post    @post = Post.find(params[:id])  end. . .

为了与我们在文件中其他地方使用的方法保持一致,我们需要修改此方法,以便@post引用与特定鲨鱼相关联的帖子集合中的特定实例。 在这里记住build方法 – 由于我们的模型之间的关联,以及通过这些关联可用于我们的方法(如build ),我们的每个post实例都是与a关联的对象集合的一部分。特别是鲨鱼。 因此,在查询特定帖子时,我们会查询与特定鲨鱼相关的帖子集合。

set_post更新为如下所示:

〜/ sharkapp /控制器/ posts_controller.rb
. . . private. . .   def set_post    @post = @shark.posts.find(params[:id])  end. . .

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

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

update方法使用@post中的@post实例变量,并将其与用户在edit表单中输入的set_post使用。 在成功的情况下,我们希望Rails将用户发送回与特定鲨鱼相关联的帖子的index视图。 如果出现错误,Rails将再次呈现edit模板。

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

〜/ sharkapp /控制器/ 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 /控制器/ 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. . .

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

〜/ sharkapp /控制器/ 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)    endend

控制器管理信息从视图模板传递到数据库的方式,反之亦然。 我们的控制器现在反映了我们的SharkPost模型之间的关系,其中的帖子与特定的鲨鱼相关联。 我们可以继续修改视图模板本身,这是用户将传入的位置并修改有关特定鲨鱼的帖子信息。

第4步 – 修改视图

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

让我们从我们帖子的基础模板开始:在多个帖子模板中重复使用的form部分。 立即打开该表单:

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

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

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

〜/ sharkapp /人次/职位/ _form.html.erb
<%= form_with(model: [@shark, post], local: true) do |form| %>. . . 

接下来, 删除列出相关鲨鱼的shark_id的部分,因为这不是视图中的必要信息。

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

〜/ sharkapp /人次/职位/ _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.shark.name更新为post.shark.name ,以便表格包含相关鲨鱼的名称字段,而不是识别有关鲨鱼对象本身的信息:

〜/ sharkapp /应用/视图/职位/ index.html.erb
. . .   <tbody>    <% @posts.each do |post| %>      <tr>        <td><%= post.body %></td>        <td><%= post.shark.name %></td>. . . 

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

将此行更新为以下内容:

〜/ sharkapp /应用/视图/职位/ 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>

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

将“ Edit行更新为如下所示:

〜/ sharkapp /应用/视图/职位/ 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 /应用/视图/职位/ 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 /应用/视图/职位/ index.html.erb
. . . <%= link_to 'New Post', new_shark_post_path(@shark) %>

完成的文件如下所示:

〜/ sharkapp /应用/视图/职位/ 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 /应用/视图/职位/ new.html.erb
. . . <%= link_to 'Back', shark_posts_path(@shark) %>

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

接下来,打开edit模板:

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

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

〜/ sharkapp /应用/视图/职位/ 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 /应用/视图/职位/ 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

我们在这里的编辑将包括在表单中添加Posts部分和文件底部的Add Post链接。

在给定鲨鱼的Facts下方,我们将添加一个新部分,该部分迭代与此鲨鱼相关的帖子集合中的每个实例,输出每个帖子的body

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

〜/ sharkapp /应用/视图/鲨鱼/ 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 /应用/视图/鲨鱼/ 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数据库的数据的一致性和一致性。 我们现在采取类似的步骤来确保对数据库数据库的保证。

打开定义Post模型的文件:

nano app/models/post.rb

在这里,我们希望确保帖子不是空白,并且它们不会复制其他用户可能发布的内容。 要实现此目的,请将以下行添加到文件中:

〜/ sharkapp /应用/模型/ post.rb
class Post < ApplicationRecord  belongs_to :shark  validates :body, presence: true, uniqueness: trueend

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

完成上一次更改后,您就可以运行迁移并测试应用程序了。

首先,运行迁移:

rails db:migrate

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

rails s

如果您正在使用开发服务器,请改为运行以下命令:

rails s --binding=your_server_ip

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

先决条件Rails项目教程引导您完成添加和编辑Great White shark条目。 如果您尚未添加任何其他鲨鱼,则应用程序登录页面将如下所示:

Shark App登陆页面

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

单击帖子标题下方的添加 帖子 这将带您进入后期index视图,您将有机会选择新帖子

发布索引视图

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

点击新帖 ,这将带您到您的帖子new模板:

最新帖子

Body字段中,键入“这些鲨鱼是可怕的!”

新鲨鱼邮报

单击“ 创建帖子” 您将被重定向到属于此鲨鱼的所有帖子的index视图:

发布成功

在我们的帖子资源有效的情况下,我们现在可以测试我们的数据验证,以确保只将所需的数据保存到数据库中。

index视图中,单击“ 新建帖子” 在新表格的Body字段中,再次尝试输入“这些鲨鱼是可怕的!”:

重复鲨鱼邮报

单击“ 创建帖子” 您将看到以下错误:

唯一的错误后

单击“ 返回”返回主帖页面。

要测试我们的其他验证,请再次单击“ 新建帖子” 将帖子留空并单击“ 创建帖子” 您将看到以下错误:

空白发布错误

通过嵌套资源和验证正常工作,您现在可以使用一个可用的Rails应用程序作为进一步开发的起点。

结论

有了Rails应用程序,您现在可以处理样式和开发其他前端组件之类的事情。 如果您想了解有关路由和嵌套资源的更多信息, Rails文档是一个很好的起点。

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

赞(0) 打赏
未经允许不得转载:老赵部落 » 如何为Ruby on Rails应用程序创建嵌套资源
data-ad-format="auto" data-full-width-responsive="true">

评论 抢沙发