ActiveRecord :: RecordNotFound (Не удалось найти блог с 'id' = undefined)
У вас есть var id = $(this).attr("id");
, но вы не определили атрибут id
в ссылке,Таким образом, $(this).attr("id")
равно undefined , что дополнительно создает URL, например "/blogs/undefined/toggle_status"
.Таким образом, :id
передается как undefined
в запрос Blog.find(params[:id])
, который завершается с этим исключением.Чтобы решить вашу проблему, определите id
следующим образом:
<%= link_to blog.status,toggle_status_blog_path(blog), remote: true, class: "test", id: blog.id %>
Примечание:
Если ваша версия Jquery > = 1.6 , тогдаattr
устарело для 1.6 и более поздних версий.Вы должны prop
вместо attr
var id = $(this).prop("id");
Обновление: # 1
Действие выполняется дважды.Это потому, что вы выполняете один и тот же AJAX вызов дважды!Один с remote:true
в ссылке, а другой с Jquery AJAX.Вы должны оставить один из них и удалить другой.Таким образом, окончательный ответ будет следующим:
<%= link_to blog.status,toggle_status_blog_path(blog), remote: true, class: "test" %>
Обновление № 2:
Поскольку ваша конечная цель заключается в мгновенном отображении обновленного статуса блога (т.е.(без обновления страницы), затем вам нужно выполнить следующие шаги
1) Измените link_to
на
<%= link_to blog.status, "javascript:void(0);", class: "test", id: blog.id %>
2) Верните свой код Jquery.Нам это нужно сейчас.Добавьте необходимый код в функцию success
$(document).ready(function() {
$("a.test").on( "click", function( event ) {
var id = $(this).attr("id");
var current_link = $(this)
$.ajax({
url: "/blogs/" + id + "/toggle_status",
type: "GET",
dataType: "json",
success: function(r){
console.log(r["blog_status"]);
current_link.text(r["blog_status"]); // this will display the status of the blog
alert("Blog status has been updated");
}
});
});
});
3) Измените свой метод toggle_status
на
def toggle_status
if @blog.draft?
@blog.published!
elsif @blog.published?
@blog.draft!
end
respond_to do |format|
format.html { redirect_to blogs_url, notice: "Blog status has been updated"}
format.json { render json: {blog_status: @blog.status, status: :ok }}
end
end