Привет, у меня проблема с рендерингом файла .erb, в моем вызове AJAX я вызываю свое действие create на рельсах, где я проверяю и обрабатываю данные формы и отправляю обратно завершенные данные заказа как render: json, который отлично работает.
У меня есть условие, которое проверяет, существует ли параметр, если он есть, то завершенные данные заказа передаются обратно в качестве ответа через render: json
Если его не существует, отобразится страница с квитанцией.
Проблема в том, что когда я визуализирую страницу квитанции, полная страница квитанции в формате HTML возвращается в качестве ответа, а не отображает страницу. Пожалуйста помоги!
$scope.placeOrder = function() {
var body = composeOrderBody();
var isValid = validateForm(body.order);
if (isValid) {
var orderComplete = '<%= @orderComplete %>';
var baseUrl = '<%= request.base_url %>';
console.info('Passing order object: ', body.order);
$http({
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
url: checkout_url,
data: {
order: body.order,
xhr_request: true
},
}).then((function(_this) {
return function(response) {
if (typeof response.data == 'undefined' || response.data == null || !response.data) {
console.info('Error: missing Order Number from Order Confirmation data.', response.data);
}
console.info('Order Confirmation response data object:' , response.data);
if (orderComplete) {
var redirectUrl = 'http://' + orderComplete
var order_params = `?oid=${response.data.oid}?cart=${response.data.cart}?total=${response.data.total}`
window.location.href = redirectUrl + order_params;
} else {
console.info('Base Url: ', baseUrl);
// window.location.href = `${baseUrl}/receipt`;
}
};
})(this));
} else {
console.info('Form Validation or Stripe Validation Failed');
}
} // end placeOrder
Код Rails
# Redirect to orderComplete URL if it's set
if [email protected]?
puts 'orderComplete parameter is not blank'
# Sum up all the line item quantities
qty = @order.line_items.inject(0) {|sum, line_item| sum + line_item.quantity}
# Get all of the coupons (and values) into a string
coupons = @order.applied_coupons.map { |coupon| coupon.coupon }.join(',')
coupon_values = @order.applied_coupons.map { |coupon| '%.2f' % coupon.applied_value.to_f }.join(',')
order_params = {
"oid" => URI::escape(@order.number),
"cart" => URI::escape(@cart),
"total" => URI::escape('%.2f' % @order.total),
}
@redirectUrl = URI.parse(URI.escape(@orderComplete))
@redirectUrl.query = [@redirectUrl.query, order_params.to_query].compact.join('&')
@redirectUrl = @redirectUrl.to_s
if params[:xhr_request]
render json: order_params.to_json
return
end
render 'receipt_redirect', :layout => 'receipt_redirect'
else
puts 'OrderComplete Parameter is blank'
render 'receipt', :layout => 'receipt', :campaign => @campaign
end
Я думаю, что это мое отключение, я подумал, что, поскольку я был внутри контроллера rails, он отобразит мой файл accept.html.erb.
Это является рендеринг чека. А затем отправьте его обратно в качестве ответа на ваш JS-запрос. Затем вам нужно сделай что-нибудь с возвращенным HTML. Мол, вставь на свою страничку. Когда вы говорите, что ожидаете «отрисовки», я думаю, вы имеете в виду, что ожидаете изменения страницы. Но вы делаете вызов AJAX, поэтому страница не изменится, пока вы ее не измените.
В этом есть смысл, спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что значит «вместо рендеринга страницы»? Если вы ожидаете, что визуализированный HTML-код будет вставлен в DOM, вам придется сделать это самостоятельно в своем JS.