Rails 从零学习 Rails 记录 (第二天)

yngzij · 发布于 2017年08月24日 · 最后由 yngzij 回复于 2017年08月25日 · 358 次阅读
96

学习rails 的第二天,一步一步来嘛!!!

添加第二个关联Model

  • 生成Model rails generate model Comment commenter:string body:text article:references 这里comment 和Comment 生成Model 一样的
  • 迁移到数据库 rails db:migrate
  • 在文章路由下添加子路由
  • 生成Controller

在View 中添加评论功能,其中关键的就是这一段代码了

 <%= form_for([@work, @work.comments.build]) do |f| %>
  <p>
    <%= f.label :commenter %><br>
    <%= f.text_field :commenter %>
  </p>
  <p>
    <%= f.label :body %><br>
    <%= f.text_area :body %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

再看看对应的Controller 方法

def show
  @work=Work.find params[:id]
end
def create
 @work=Work.new work_params
 if @work.save
    redirect_to @work
else 
    render 'new'
  end
end
  1. show 方法在create 成功保存后在create方法中重定向调用,显示创建的@work对象数据.
  2. redirect_to 把自己创建好的work对象发送给show 方法,show 方法通过id 查找到相应的work对象
  3. <%= form_for([@work, @work.comments.build]) do |f| %> 因为create 的路由是 post /works/:work_id/comments(.:format) 评论需要嵌套在文章中,@work 是在controller 中查找到的对象,在@work model 中用 has_many 关联了,所以能在@work.comments.build 可以用
  4. 如果保存不成功 ,在new 界面显示错误

** 这里render ,link_to, redirect_to ** 三者的区别

  • link_to 在网站上生成 超链接 的代码 用于view 中连接到其他路由
  • render 将指定视图作为响应 ,这里在没有保存成功 ,render 到'new' 在new.html.erb 中会将@work错误中的错误显示出来,因为在同一个方法中,显示的就是本方法中的@wrok,而且render 还能导入代码。
  • redirect_to 重定向,将浏览器重定向到指定的目标,为什么 @work 就是show 页 @work 不是在create 方法中创建的一个对象吗? 难道因为路由是 work GET /works/:id(.:format) works/show 吗 这里自己的理解也不好,百度了好多也是模模糊糊的 😭

显示评论

代码位置 app/views/articles/show.html.erb

<h2>Comments</h2>
<% @work.comments.each do |comment| %>
  <p>
    <strong>Commenter:</strong>
    <%= comment.commenter %>
  </p>

  <p>
    <strong>Comment:</strong>
    <%= comment.body %>
  </p>
<% end %>

将Controller 中找到的@work中的comments 模型内容显示出来,demo 在(https://github.com/yngzij/rails-) 希望对后来的朋友有帮助

  • 安装和生成框架就算完了 其他重构,验证什么的都很容易理解,redirect_to和render谢谢朋友能解释下 😅 a
  • create 后redirect_to @work 定向到show 页面,显示的是new 中创建的数据,那show 是怎么获取到的呀 😄
共收到 4 条回复
1

不要拿论坛当日记本,写到自己的博客去。

5ae6f4

如果你一天一贴,论坛就全是你的帖子了,写博客是个不错的方法,等你有一定收获了再跟大家分享一下😄

96
1Rei 回复

好的嘞

96
5ae6f4superkun 回复

是哦 好的嘞☺

32 yngzij 关闭了讨论 08月25日 00:58
32 yngzij 重新开启了讨论 08月25日 00:59
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册