从 Ajax 响应中撕裂部分不是更新变量

Rending partial from Ajax response is not updating variable

提问人:Jeremy Thomas 提问时间:5/25/2023 更新时间:5/25/2023 访问量:22

问:

我有一个 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>

问题是视图不知道的值已更新,我不确定如何解决该问题,以便可以显示响应。@ingredientsIngredientsController

jQuery Ruby-on-Rails AJAX

评论


答:

0赞 Jan Vítek 5/25/2023 #1

这是从 JS 角度硬编码的,就像最初呈现页面时一样。如果您检查页面并在加载的资产中找到代码,则可以检查它。console.log("<%= @ingredients %>")console.log("[]")

获取实际数据后,您必须将其作为对调用的响应返回。发出 type 请求并返回类似 from your controller 的内容。然后在前端,您应该在变量中包含这些数据,因此请使用它而不是/ingredients/searchapplication/jsonrender json: @ingredientsres<%= @ingredients %>

评论

0赞 Jeremy Thomas 5/25/2023
我应该如何使用 javascript 变量渲染 rails 部分?
0赞 Jeremy Thomas 5/25/2023 #2

我能够通过将 DOM 修改 javascript 移动到由 .我生成了一个包含以下内容的文件:IngredientsControllersearch.js.erb

$('.ingredientSelectionModalBody').html("<%= j(render 'recipes/ingredient_search_table', ingredient_array: @ingredients) %>")
$('.ingredientModal').modal({show: true})

由于这是在更新后呈现的,因此来自控制器的新数据可用。@ingredients