【问题标题】:Json object in Rails viewRails 视图中的 Json 对象
【发布时间】:2014-12-03 13:23:13
【问题描述】:

我在 Rails 应用上有一个搜索页面。 Search 控制器根据模型中的查询获取空间,并将它们作为 json 返回。我在视图中使用 $.getJSON 来获取它们:

搜索控制器:

respond_to :html, :js

  def index
    @spaces = Space.find_spaces(params)
  end

空间模型

def self.find_spaces(params = {})
  params ||= {}
  spaces = Space.all
  spaces = spaces.near(params[:location], 10) if params[:location].present?
  # spaces = space.where("name LIKE ? ", params[:name]) if params[:name].present?
  spaces = spaces.where("description LIKE %?%" , params[:description]) if params[:description].present?
  spaces
end

脚本(views/search/index.html.erb)

$( document ).ready(function() {
    $( "#search_form" ).submit(function() {
        // clear out current results first
        $('#spaces').empty();
        // fetch all results
    $.getJSON( "/search.json", $('#search_form').serialize())
    .done(function( data ) {
            $.each(data, function(key, space) {
                $('#spaces').append("<h1>" + space.name +  "</h1><p>" + space.description + "</p>");
            });
        });
    }).trigger('submit'); //this is to submit on page load if coming from home page
});

这一切正常,我可以访问 JSON 对象,并使用 jquery 在视图中显示它,它会按预期更新而无需刷新,并根据表单/查询获得正确的结果。

我的问题是关于在视图中处理 Json 数据。

我这样做对吗?看起来有点傻,因为现在我不能使用任何 Rails 助手(例如链接助手),因为它只是 javascript/json 对象。我不想最终添加一个可怕的 html 与对象 ID 等来创建链接。

我应该这样做吗?我已经阅读了文档和其他一些教程,但没有任何地方真正(根本)描述了在视图中使用返回的 Json 的最佳方式。我应该使用局部吗? .js.erb 文件?魔法?

感谢您的启发!

【问题讨论】:

    标签: javascript jquery ruby-on-rails ajax json


    【解决方案1】:

    您实际上可以使用 ajax 来获取整个呈现的 HTML,然后简单地将整个结果附加到 #spaces 中,而不是使用 ajax 来获取 JSON 数据。首先在你的控制器中创建一个新动作

    搜索控制器:

    def result
      @spaces = Space.find_spaces(params)
    end
    

    路由.rb

    match "search/result" => "search#result"
    

    然后你的视图views/search/result.html.erb

    <% @spaces.each do |space| %>
    <h1><%= space.name %></h1><p><%= space.description %></p>
    <% end %>
    

    现在您可以使用 ajax 从 rails 获取渲染视图,并使用 javascript 将其整体放置

    $( document ).ready(function() {
        $( "#search_form" ).submit(function() {
            $('#spaces').empty();
            $.get( "/search/result", $('#search_form').serialize())
            .done(function( search_result_html ) {
                $("#spaces").html( search_result_html );
            });
        }).trigger('submit'); //this is to submit on page load if coming from home page
    });
    

    这样你就可以在 view/sea​​rch/result.html.erb 中渲染所有内容并使用你想要的任何 rails helper

    【讨论】:

    • 谢谢你,解释得很好。文档中没有任何地方真正像那样详细介绍流程。
    猜你喜欢
    • 2011-07-06
    • 2014-02-02
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    相关资源
    最近更新 更多