我正在尝试生成一个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
答案 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 %>