Ajax请求不适用于Rails中的控制器操作

时间:2019-07-12 10:47:06

标签: ruby-on-rails ruby ajax controller

我正在尝试生成一个ajax请求来调用博客控制器count操作,但出现错误,并且无法弄清原因。请帮我找到它。下面是带有错误的代码。

blogs_controller.rb

  def count
    @blog = Blog.find(params[:blog_id])
    @blog.increment!(:blog_count)
    redirect_back(fallback_location: blogs_path)
  end

show.html.erb

<button onclick="CountFun()" class="btn btn-success float-right" id="first" >Copy</button>

<script>
 $('#first').click(function(e) {
     e.preventDefault();
   $.ajax({
    type: "PUT",
    url: "#{blog_count_path(@blog)}"
  });
 });
</script>

错误消息

ActionController :: ParameterMissing(参数丢失或值为空:博客):

app / controllers / blogs_controller.rb:79:in blog_params' app/controllers/blogs_controller.rb:45:in在更新中阻止” app / controllers / blogs_controller.rb:44:在“更新”中

只是为了测试我是否以正确的方式定义了控制器动作,我为此添加了link_to按钮只是为了查看它是否有效,并且像冠军一样工作,只是我收到了ajax请求的错误。

<%= link_to 'Count', blog_count_path(@blog), method: :put, id: 'second' %>

routes.rb

resources :blogs, path: '/' do
 put :count
end

2 个答案:

答案 0 :(得分:1)

使用帖子或放置路线。您没有可渲染的视图,因此只需在控制器操作中执行即可。

def count
  @blog = Blog.find(params[:blog_id])
  if @blog && @blog.increment!(:blog_count)
    render json: { data: 'OK', status: 200 }
  else
    render json: { error: "blog did not increment" }, status: :unprocessable_entity
  end
end

答案 1 :(得分:1)

您的问题所在的位置与您所想的不同,路径和操作正确,但是您的脚本没有正确的路径,因为您只是通过了#{blog_count_path(@blog)}erb看不到要解析的任何内容。

因此,您在show.html.erb中需要确保erb知道要替换某些东西:

$.ajax({
  type: "PUT",
  url: "<%= blog_count_path(@blog) %>"
});

一种更好的方法是完全忽略脚本,并直接使用remote: true创建按钮

<%= button_to "Count", blog_count_path(@blog), method: :put, remote: true %>