【Ruby on Rails全栈课程】3.9 发布(创建)帖子

简介: 1、创建数据库表格(1)创建posts表来保存贴子信息,表结构如下:

1、创建数据库表格


(1)创建posts表来保存贴子信息,表结构如下:


image.png


(2)在项目命令行下执行rails g model命令创建post数据表映射文件,再执行rake db:migrate将映射文件映射到数据库中


#创建映射文件
/vagrant/data_symtem$ rails g model post head:string body:text account_id:integer as_type:integer status:integer
#系统返回信息
    create    db/migrate/20181012111922_create_posts.rb
    create    app/models/post.rb
    invoke    test_unit
    create      test/models/post_test.rb
    create      test/fixtures/posts.yml
#将db/migrate/20181012111922_create_posts.rb映射文件映射到数据库中,创建post数据表
/vagrant/data_symtem$ rake db:migrate
#系统返回信息
  == 20181012111922 CreatePosts: migrating ======================================
  -- create_table(:posts)
     -> 0.0136s
  == 20181012111922 CreatePosts: migrated (0.0151s) =============================


3)运行rails g controller posts new create 创建posts_controller.rb文件,

posts_controller.rb文件文件中new、create实例方法,views目录下每个实例方法对应的html文件、routes.rb文件中每个实例方法对应的路由。


new方法用来查询显示新建帖子的页面的数据


create方法用来接收创建新帖子的params数据


/vagrant/data_system$ rails g controller posts new create
#系统返回信息
     create  app/controllers/posts_controller.rb
     route  get 'posts/create'
     route  get 'posts/new'
     invoke  erb
     exist    app/views/posts
     create    app/views/posts/new.html.erb
     create    app/views/posts/create.html.erb
     invoke  test_unit
     create    test/controllers/posts_controller_test.rb
     invoke  helper
     create    app/helpers/posts_helper.rb
     invoke    test_unit
     invoke  assets
     invoke    coffee
     create      app/assets/javascripts/posts.coffee
     invoke    scss
     create      app/assets/stylesheets/posts.scss


(4)修改routes.rb文件


#原代码
get 'posts/create'
#改为
post 'posts/create'


代码解析:


post 'posts/create'


这行代码相当于post 'posts/create' => 'posts#create',意思为调用名为posts的Controller中名为create的Action。如果路由的链接的形式为「Controller名/Action名」的形式,那么路由=>后面的内容可以省略掉


2、显示创建帖子的页面


(1)在posts_controller.rb文件中添加上before_action,基本上所有controller都要在before_action时加上check_login方法,这样每次执行action方法之前都会check_login方法,用来检查当前的登陆用户。


#参考代码,无需粘贴


#参考代码,无需粘贴
#class PostsController < ApplicationController
before_action :check_login


(2)添加样式,在app/assets/stylesheets/posts.scss中添加下列代码


.new-issue-form-container {
  width: 800px;
  background: white;
  margin: 30px auto;
  .new-issue-form {
    width: 600px;
    margin: 10px auto;
  }
}
.submit-issue-button {
  height: 50px;
  width: 100%;
}


(3)打开views/posts/new.html.erb文件,删掉现有内容,粘贴下面内容,显示标题框、内容框:


<div class="new-issue-form-container clearfix">
  <div class="new-issue-form clearfix">
    <%= form_for Post.new,url: "/posts/create" do |f| %>
      <%= f.hidden_field :account_id %>
      <dl class="form">
        <dt><%= f.label "标题" %></dt>
        <dd><%= f.text_field :head %></dd>
      </dl>
      <dl class="form">
        <dt><%= f.label "内容" %></dt>
        <dd><%= f.text_area :body %></dd>
      </dl>
      <input type="submit" value="发布" class="submit-issue-button btn btn-primary">
    <% end %>
  </div>
</div>


代码解析:


<%= form_for Post.new,url: "/posts/create" do |f| %>


我们需要注意的是,这行代码form_for后面跟的Post.new,而不是@post。如果想用@post的话,需要在posts_controller中的new方法中添加@post = Post.new,这样form_for后面就可以用@post了。实际上本质都是Post对象。


我们建议form_for后面直接用Post.new。因为如果后面直接用@post的话,比如posts_controller中的create方法中有render :new代码会出错。我们之前介绍过render的特点,直接渲染new.html.erb页面,不会经过new这个action,所以@post变量就会变成未定义,从而出错。


(4)编辑views/home/index.html.erb文件,加上/posts/new链接。这样我们在网站首页点击「发布新帖」按钮,就能进入到创建帖子页面


<!--原代码-->
<%= link_to "发布新帖", "#", class: "banner-btn btn" %>
<!--改为-->
<%= link_to "发布新帖", "/posts/new", class: "banner-btn btn" %>

(5)rails s启动项目,登录账号,点击首页「发布新帖」按钮,我们看一下效果:

A


image.png


3、编辑posts_controller.rb文件中的create方法。点击发布按钮,我们会将new页面中的填写的信息,以params哈希的形式提交到 "/posts/create”对应的posts_controller.rb中的create方法。


(1)创建帖子功能描述


(1)标题不能为空,内容不能少于8个字


(2)发布成功后重定向到根目录,未成功render到new页面


(2)编辑posts_controller.rb文件中的create方法,处理从new页面传过来的params数据,并存到数据库中


def create
  head = params[:post][:head]
  body = params[:post][:body].strip
  if head.blank?
    flash.notice = "标题不能为空"
  elsif body.length < 8
    flash.notice = "内容长度不能少于8个字"
  else
    post = Post.new(account_id: @current_user.id,as_type:0,status:0)
    post.head = head
    post.body = body
    boolean = post.save
    if boolean
      flash.notice = "发布成功"
      redirect_to :root
    else
      flash.notice = "发布失败,请重新发布"
      render "/posts/new"
    end
  end    
end


(3)最后,我们来测试一下,填写标题以及不少于8个字的内容,点击发布按钮发布帖子,发布成功后,在ctrl_c停止项目,再输入rails c进入控制台。输入Post.all查看Post对象是否正确保存了。


#进入控制台
/vagrant/data_system$ rails c
#查看创建的所有帖子
irb(main):001:0> Post.all
=> #<ActiveRecord::Relation [#<Post id: 1, head: "第一个帖子", body: "欢迎来到宠物之家论坛", account_id: 1, as_type: 0, status: 0, created_at: "2018-10-15 07:03:57", updated_at: "2018-10-15 07:03:57">]>


有结果,说明保存成功了。下一章我们会在网站主页面将创建的帖子显示出来。

目录
相关文章
|
3月前
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
3月前
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
43 0
|
3月前
|
前端开发 API C++
在Ruby世界中寻找你的Web框架灵魂伴侣:Rails vs Sinatra
【8月更文挑战第31天】在Ruby的世界里,选择Web框架如同挑选衣物,需根据场合和需求。Rails与Sinatra是两大热门框架,前者以其“约定优于配置”理念和全面的功能成为企业级应用的首选;后者则以轻量级和灵活性著称,适用于快速原型开发和小规模应用。通过对比两者特性,如Rails的MVC架构与Sinatra的简洁API,我们可以看到它们各有所长。选择合适的框架,如同找到旅途中的最佳伙伴,让开发之路更加顺畅愉悦。这场探索之旅教会我们,没有绝对的好坏,只有最适合的选择。
35 0
|
3月前
|
安全 前端开发 数据安全/隐私保护
如何在Ruby on Rails中打造坚不可摧的OAuth认证机制
【8月更文挑战第31天】在构建现代Web应用时,认证与授权至关重要。本文介绍如何在Ruby on Rails中实现OAuth认证,通过使用`omniauth`和`devise` gems简化流程。首先安装并配置相关gem,接着在`User`模型中处理OAuth回调,最后设置路由及控制器完成登录流程。借助OAuth,用户可使用第三方服务安全地进行身份验证,提升应用安全性与用户体验。随着OAuth标准的演进,这一机制将在Rails项目中得到更广泛应用。
48 0
|
4月前
|
SQL 安全 数据库
Ruby on Rails 数据库迁移操作深度解析
【7月更文挑战第19天】Rails 的数据库迁移功能是一个强大的工具,它帮助开发者以版本控制的方式管理数据库结构的变更。通过遵循最佳实践,并合理利用 Rails 提供的迁移命令和方法,我们可以更加高效、安全地管理数据库结构,确保应用的稳定性和可扩展性。
|
5月前
|
前端开发 测试技术 数据库
Ruby on Rails:快速开发Web应用的秘密
【6月更文挑战第9天】Ruby on Rails,一款基于Ruby的Web开发框架,以其高效、简洁和强大备受青睐。通过“约定优于配置”减少配置工作,内置丰富功能库加速开发,如路由、数据库访问。活跃的社区和海量资源提供支持,MVC架构与RESTful设计确保代码清晰可扩展。高效的数据库迁移和测试工具保证质量。Rails是快速构建Web应用的理想选择,未来将持续影响Web开发领域。
|
6月前
|
开发框架 安全 前端开发
使用Ruby on Rails进行快速Web开发
【5月更文挑战第27天】Ruby on Rails是一款基于Ruby的高效Web开发框架,以其快速开发、简洁优雅和强大的社区支持著称。遵循“约定优于配置”,Rails简化了开发流程,通过MVC架构保持代码清晰。安装Ruby和Rails后,可使用命令行工具创建项目、定义模型、控制器和视图,配置路由,并运行测试。借助Gem扩展功能,优化性能和确保安全性,Rails是快速构建高质量Web应用的理想选择。
|
6月前
|
Ruby
|
6月前
|
JSON 数据格式 Ruby
|
6月前
|
调度 Ruby