【问题标题】:Rendering Rails Partial from AJAX and passing in local variables from AJAX从 AJAX 渲染 Rails Partial 并从 AJAX 传入局部变量
【发布时间】:2013-01-22 03:05:08
【问题描述】:

我正在尝试使用此链接中的 AJAX 请求渲染 Rails 部分(并将局部变量传递给渲染的部分):

http://isotope11.com/blog/render-partials-with-ajax-requests

他正在做的是使用 .get 对呈现部分的控制器进行 ajax 调用:

  $.get("/ean_hotels/"+ id, params, function(data){
  $('#hotelModalContent').html(data);
  }, "html");

  $('#hotelModal').reveal();

以及在hotels_controller.rb 中控制器动作结束时的“渲染”:

render partial: 'hotel_modal_content', locals: { hotel: @hotel, hotel_review_widget: hotel_review_widget }, layout: false 

您可以看到控制器代码为要渲染的部分设置了局部变量(即hotel 和hotel_review_widget)。

我不明白如何从原始 .get AJAX 调用中传入这些局部变量。

我也不确定使用 .get 进行 AJAX 调用时的参数是什么

我希望能够将局部变量从 javascript 传递到 hotels_controller.rb,它将局部变量映射到局部变量。

感谢您的帮助。

编辑:

添加部分代码

_hotel_model_content.html.erb

<h3><%= hotel %></h3>

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-3 jquery


    【解决方案1】:

    客户

    根据$.get$.ajax 文档,params 将进入 URL 的查询字符串部分:

    // request to /somethings?a=abc&b=2
    $.get('/somethings', {a: 'abc', b: 2})
    

    服务器

    查询字符串参数可以通过名为params 的类似哈希的对象从Rails 操作中访问。 [1]

    class SomethingsController < ApplicationController
      def index
        puts params[:a] # if URL was /somethings?a=123, will print 123
      end
    end
    

    放在一起

    让我们用一个部分来做一个完整的例子。

    这是客户端代码:

    // client call to /somethings?name=Something+123
    $.get('/somethings', {name: 'Something 123'}, function(data){
      $('#target').html(data);
    });
    

    这里是服务器:

    class SomethingsController < ApplicationController
      def index
        # bind controller variable @name
        @name = params[:name]
      end
    end
    

    视图内app/views/somethings/index.html.erb

    <%= render :partial => 'some_partial', :locals => {:name => @name} %>
    

    我已将部分渲染移至视图中。我认为从视图渲染局部比直接从控制器渲染局部更标准。

    【讨论】:

    • 感谢@sebastian goodman。这很有意义,但由于某种原因,我无法让局部变量通过。仍然收到“#:0x007f92b4761378> 的未定义局部变量或方法 `name' 的错误”我尝试了其他一些方法,例如 render :partial => 'some_partial', :locals => { :name => @name} 但也不起作用。想知道什么给了。我知道它的其余部分可以工作,因为如果我只是将@name 放入部分中,它会通过 name 的参数
    • 我已经稍微重构了我的答案,因为直接从控制器渲染部分可能会出现问题。试试这个方法,看看是否有效。
    • 我刚刚添加了部分代码。我同意您的最新评论,即直接从控制器渲染局部变量并尝试通过表面变量传递局部变量。我必须弄清楚我正在做的事情是从视图中渲染部分内容。这需要一些思考,因为我想从控制器渲染部分的原因是因为正在渲染的部分是来自 ajax 调用的动态。谢谢您的帮助!会让你知道的。
    • 我最终只是将来自 AJAX 调用的参数作为实例变量传递给我正在渲染的局部视图。所以直接使用@hotel。由于您提供的具体示例,我喜欢您的回答。帮助我完全了解发生了什么
    猜你喜欢
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多