Я пытаюсь сгенерировать запрос ajax для вызова действия подсчета контроллера блога, но получаю сообщение об ошибке и не могу понять причину. Пожалуйста, помогите мне найти его. Ниже код с ошибкой.
blogs_controller.rb
def count
@blog = Blog.find(params[:blog_id])
@blog.increment!(:blog_count)
redirect_back(fallback_location: blogs_path)
end
показать.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' %>
маршруты.rb
resources :blogs, path: '/' do
put :count
end
попробуйте #{blog_count_path(:blog_id => @blog.id) или добавьте data: {blog_id : #{@blog.id}
Вы заявляете о count действии, но ошибка заключается в update действии.
@NickM Я попробовал это с blog_id: 2, но получил эту ошибку PUT локальный: 3000/2 400 (неверный запрос)
@AbhishekAravindan Я попробовал, но получил эту ошибку PUT локальный: 3000/2 400 (неверный запрос)
@AbhishekAravindan да, я сделал. Я обновлю свой вопрос с помощью файла route.rb.
$('#first').click(function(e) { e.preventDefault(); $.ajax({ type: "get", url: "blogs/count", data : {blog_id: #{@blog.id} }); }); и в вашем route.rb изменить на get 'count'@AbhishekAravindan Я получил это ** Завершено 404, не найдено за 3 мс (ActiveRecord: 0,5 мс) ActiveRecord::RecordNotFound (не удалось найти блог с «id» = blogs): app/controllers/blogs_controller.rb:66:in `count '**
Вы можете распечатать params[:blog_id] в действии и проверить в своем терминале, что печатается???
Я использовал buybug, чтобы проверить значение, которое он печатает значение идентификатора блога (byebug) params[:blog_id] "2"
вы получаете @blog из Blog.find(params[:blog_id]) ??? попробуй тоже распечатать....
Blog.find(params[:blog_id]) дает мне всю запись блога. Идентификатор блога: 2, заголовок: "Мой пост в блоге", preview_text: "демонстрационный тест", тело: "тело блога", user_id: 1, created_at: "2019-07-12 09:16:33", updated_at: " 2019-07-12 09:16:33", количество блогов: 43>
@blog.increment!(:blog_count) в записи что-то изменилось?
@AbhishekAravindan кнопка link_to, которая добавлена, как показано в вопросе, работает, поскольку я хочу, чтобы действие контроллера подсчета работало, но оно не работает с запросом ajax.
render json: { flag: true }добавьте вместо redirect_to
@AbhishekAravindan PUT локальный: 3000/2 400 (неверный запрос) ActionController::ParameterMissing (параметр отсутствует или значение пустое: блог) все та же ошибка
ваш route.rb все еще ставится ??
@AbhishekAravindan да, он все еще ставится.
изменить, чтобы получить «количество»
Я изменил его, чтобы получить, это не привело к какой-либо ошибке, но значение не увеличилось.





Использовать пост или поставить маршрут. У вас нет представления для рендеринга, поэтому просто сделайте это в своем действии контроллера.
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
Завершено 400 неверных запросов за 3 мс (ActiveRecord: 0,7 мс) ActionController::ParameterMissing (параметр отсутствует или значение пустое: блог): я получил эту ошибку
@Navroop, можете ли вы добавить ошибку покупки и найти вставку вывода параметров?
Ваша проблема в другом месте, чем вы думаете, путь и действие правильные, но ваш скрипт не имеет правильного пути, потому что вы его только что прошли #{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 %>
Вы проверили, чтобы запрос PUT был отправлен на правильный URL-адрес? Вы пытались добавить данные: { blog_id: WHATEVER } в запрос и посмотреть, работает ли это?