zoukankan      html  css  js  c++  java
  • [ruby on rails] 跟我学之(7)创建数据

    通过form来创建数据,本章节将会涉及内容:创建form,用户重导向,渲染views 和 flash消息。

    1. views初步

    编辑 app/views/posts/index.html.erb这个view文件,如下:

    <% @posts.each do |post| %>
      <h2><%=link_to post.title,post%></h2>
      <%=post.context%><br/><hr/>
    <% end %>
    <p><%= link_to "Add a post", new_post_path %></p>
    

    new_post 是 new动作的prefix,参考[ruby on rails] 跟我学之路由映射,但在其后面添加了_path后缀。

    然后编辑app/views/posts/new.html.erb这个view文件,如下:

    <h1>Add a new post</h1>
    

    2. 绑定到对象

    问题来了,怎么绑定到对象?

    解决方法是先创建一个空的对象,修改new 动作,如下:

      def new
        @post = Post.new
      end
    

    然后view文件就可以使用它了,修改app/views/posts/new.html.erb文件,如下:

    <h1>Add a new post</h1>
    
    <%= form_for @post do |f| %>
      <p>
       <%= f.label :title%><br/>
       <%= f.text_field :title%>
      </p>
      <p>
       <%= f.label :context%><br/>
       <%= f.text_area :context%>
      </p>
      <p>
       <%= f.submit "New Post"%>
      </p>
    
    <% end %>

    使用label显示字段名称, 由于context(content)是text类型,所以用text_area显示比较好。注意 form_for方法。

    3. 实际的保存

    实际保存是由create进行的,修改create动作如下,

    保存成功,则跳转到index页面,否则停留在new页面,具体代码如下:

      def create
        @post = Post.new(post_params)
        if @post.save
          redirect_to posts_path, :notice=>"Your post was saved"
        else
          render "new"
        end
      end
    
    
      private
      def post_params
        params.require(:post).permit(:title,:context)
      end
    

    其中:

    1. 需要添加强类型的支持,

    post_params属于强类型。会猜测传进来的参数里有哪些东东,允许哪些东东,性质上有点类似接口。

    有兴趣了解为什么的话看这里

    2.notice 属于一个在flash消息,需要添加对flash消息的支持,修改全局view文件,也就是app/views/layouts/application.html.erb如下:

    <!DOCTYPE html>
    <html>
    <head>
      <title>Blog</title>
      <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
      <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
      <%= csrf_meta_tags %>
    </head>
    <body>
    <% flash.each do |k,v| %>
      <p><%=v%></p>
    <% end%>
    
    <%= yield %>
    
    </body>
    </html>
    

     其中添加的部分是:

    <% flash.each do |k,v| %>
      <p><%=v%></p>
    <% end%>
    

     注意 <%= yield %>,这个部分相当于django的 block 标签,定义了一个容器区(placeholder),其他的页面(index,new,edit,show)都会在这个区域进行渲染。

     flash消息只是显示一次,对于一个request来说。

    最终效果如下:

    转载请注明本文来自:http://www.cnblogs.com/Tommy-Yu/p/4141518.html,谢谢!

  • 相关阅读:
    asp.net大文件断点续传
    JS大文件上传解决方案
    B/S大文件上传解决方案
    B/S上传整个文件夹
    网页上传整个文件夹
    POJ 1068 Parencodings
    74LS85 比較器 【数字电路】
    二叉树的建立与先序,后序,中序输出
    Android 学习之 开源项目PullToRefresh的使用
    理解矩阵及谱聚类小记
  • 原文地址:https://www.cnblogs.com/Tommy-Yu/p/4141518.html
Copyright © 2011-2022 走看看