提问人:Jeremy Thomas 提问时间:5/25/2023 更新时间:5/25/2023 访问量:22
从 Ajax 响应中撕裂部分不是更新变量
Rending partial from Ajax response is not updating variable
问:
我有一个 Rails 部分,我正在尝试根据 Ajax 响应填充和显示,但似乎实例变量没有更新。我知道我错过了什么。
这可能是因为我对视图使用了与 ajax 调用不同的控制器。
当我的视图实例化时,我提供了一个值,否则我的部分会抛出错误:@ingredients
# RecipesController#new
def new
@recipe = Recipe.new
@ingredients = []
end
下面是用户单击按钮时调用的 ajax 函数:
$('.ingredientContainer').on('click', '.searchForIngredient', function(e) {
e.preventDefault();
const ingredientName = $(this).parents('fieldset').find('.ingredient-item').val()
$.ajax({
method: 'post',
url: '/ingredients/search',
data: {
name: ingredientName
},
success: (res) => {
// This displays the correct response
console.log("res", res)
// This prints [] as if @ingredients has not changed
console.log("<%= @ingredients %>")
$('.ingredientSelectionModalBody').html("<%= j(render partial: 'ingredient_search_table', locals: {ingredient_array: @ingredients}) %>")
$('.ingredientModal').modal({show: true})
}
})
})
这是从 Ajax 请求调用的,我希望在其中定义 的值:IngredientsController
@ingredients
class IngredientsController < ApplicationController
def search
@ingredients = Tools.searchForIngredient(params['name'])
end
end
这是我渲染到模态主体中的部分:
<table class="table table-awaken">
<thead>
<th>Name</th>
<th>Brand</th>
<th>Description</th>
</thead>
<tbody>
<%= ingredient_array.inspect %>
<% ingredient_array.each do |ingredient| %>
<tr>
<td><%= ingredient.name %></td>
<td><%= ingredient.brand %></td>
<td><%= ingredient.description %></td>
</tr>
<% end -%>
</tbody>
</table>
问题是视图不知道的值已更新,我不确定如何解决该问题,以便可以显示响应。@ingredients
IngredientsController
答:
这是从 JS 角度硬编码的,就像最初呈现页面时一样。如果您检查页面并在加载的资产中找到代码,则可以检查它。console.log("<%= @ingredients %>")
console.log("[]")
获取实际数据后,您必须将其作为对调用的响应返回。发出 type 请求并返回类似 from your controller 的内容。然后在前端,您应该在变量中包含这些数据,因此请使用它而不是/ingredients/search
application/json
render json: @ingredients
res
<%= @ingredients %>
评论
我能够通过将 DOM 修改 javascript 移动到由 .我生成了一个包含以下内容的文件:IngredientsController
search.js.erb
$('.ingredientSelectionModalBody').html("<%= j(render 'recipes/ingredient_search_table', ingredient_array: @ingredients) %>")
$('.ingredientModal').modal({show: true})
由于这是在更新后呈现的,因此来自控制器的新数据可用。@ingredients
评论