最近在写一个 blog 系统练练手, 遇到一个一个问题, 用户添加评论的时候想发送 ajax 请求, 但是 rails 里的 ajax 和 Python 中的不太一样, Python 中的 ajax 是用 js,jquery 实现的和 rails 不太一样, 在此记录一下, 研究了好久终于弄明白了一点
告诉框架我们要发送 ajax 请求
rails 这个框架吧, ajax 与后端结合的非常紧密.
当我们想发送一个 ajax 请求的时候, 在模板生成的时候我们可以添加一个属性
form 表单, <%= form_for (Comment.new), url: post_comments_path(@post),remote:true do |f| %> 当我加上 remote:true 时那么就会发送 ajax 请求了.
a 标签 也是一样 <%= link_to 'ajax-request', '/xxxx/create', remote: true%> 这样也就可以发送 ajax 请求了.
为什么我们这么一设置就可以发送 ajax 请求了呢. 因为 rails 内部使用了?
Rails 使用一种叫做 Unobtrusive JavaScript(UJS) https://github.com/rails/jquery-ujs 的方式来挂载内建的 JavaScript 功能, 也就是你在 app/assets/javascripts/application.js 里面加载的 //= require jquery_ujs, 这些功能包括
让超连结可以用 :method 参数支援非 GET 方法
用超连结, 按钮和表单可以用 :remote => true 支援 Ajax
超连结, 按钮和表单可以用 "data-confirm" 参数可以跳确认对话视窗
送出按钮可以用 data-disable-with 参数在送出表单时暂时关闭按钮避免重复送出
这里我也遇到了一个问题当我直接发送的时候, 服务器告诉我没有 csrf token 验证
这里我们需要在模板中加上 <%= csrf_meta_tags %> 这样就不会出错了
Ajax 请求的过程
1. 当我们点击发送 ajax 请求的时候, 会到相应的控制器中. 比如我这里到了 cmment 控制器中.
- comments_conttroller.rb
- class CommentsController <ApplicationController
- def create
- pp params
- @post = Post.where(id: params[:post_id]).first
- @comment = Comment.new(user_id: current_user.id, post_id: params[:post_id], content: params[:comment][:content])
- respond_to do |format|
- if @comment.save
- format.html # 里面是要生成的 html 代码, 就是我在页面上要添加的
- format.js #执行的 js 代码 文件名和方法名一致, 例如我这个是 create.js.erb
- format.json {render json: @comment}
- end
- end
- end
- private
- def comment_params
- params.require(:comment).permit(:content)
- end
- end
respond_to do |format| "https://api.rubyonrails.org/classes/ActionController/MimeResponds.html" 可以到该网站去查看用法
主要就是看返回什么我们这里是 ajax 请求那么返回的就是 format.js
2. 到了相应的 create.js.erb 中
- $("#comment_content").append("<%= escape_javascript(render'create') %>")
- <%= escape_javascript(render 'create') %>
这里回去找相对应的模板 我这里 render 'create' 那么他就回去找 (因为我这里是 comments 下, 回在 comments 目录下找)_create.html.erb.
这样就可以发送 ajax 请求了
来源: https://www.cnblogs.com/Stay-J/p/9543527.html