2016-06-24 2 views
-1

Я хотел бы иметь возможность отображать несколько Json-рендерингов в моем контроллере. У меня есть API-интерфейс рельсов Json с использованием модели serial serializers gem. На данный момент я могу сделать только один объект. То, что я хотел бы сделать, это также сделать @news и @users, но прямо сейчас я только рендеринг @articles.Rails Render Multiple in controller Использование Json API

Backend Статьи controller.rb:

class ArticlesController < ApplicationController 
impressionist :actions=>[:show] 
    # GET /articles 
    # GET /articles.json 
    def index 
    @articles = Article.where(:is_published => true).order('created_at DESC').page(params[:page]).per(6) 
    @news = Article.where(:news => true) 
    @users = User.all 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @articles.all } 
    end 
    end 
end 

Backend Статья Serializer:

class ArticleSerializer < ActiveModel::Serializer 
    attributes :id, :title, :teaser_title, :content, :teaser_content, :category, :author, :published, :num_comments, :tags, :featured, :app, :news, :tech, :device, :game, :laptop, :image, :user_id, :is_published, :created_at, :updated_at, :impressionist_count, :previous_post, :next_post, :user_id 
end 

Frontend сайт Статья Модель:

require 'active_resource' 

class Article < ActiveResource::Base 
    self.site = "http://localhost:3000" 
end 
Статьи

Frontend сайта Контроллер:

class ArticlesController < ApplicationController 
    def index 
    @articles = Article.where(:is_published => true) 
    @news = Article.where(:is_published => true, :news => true) 
    @users = User.all 
    end 
end 

Frontend сайт Статья index.html.erb:

<div id='outer-wrapper'> 
     <div class='margin-1200'> 
     <div id='content-wrapper'> 
      <!--Featured Post Home--> 
      <div class='coverflow section' id='coverflow'> 
        <ul id="lightSlider"> 
        <% @news.each do |news| %> 
        <% if news.is_published? %> 
<li class="recent-box" style="overflow: hidden; float: left; width: 395px; height: 292px;"><div class="imageContainer"><a target="_top" href="<%= seofy_article_url(news) %>"><img alt="<%= news.title %>" title="<%= news.title %>" src="<%= api_domain_image(news) %>" class="label_thumb"></a></div> 
<%= link_to news.title, seofy_article_url(news), :class => "label_title" %> 
<div class="toe"><span class="post-date" href="http://socioism.blogspot.com/2015/01/the-year-2015.html"><i class="fa fa-calendar"></i> <%= article_date(news) %></span><span target="_top" href="http://socioism.blogspot.com/2015/01/the-year-2015.html#comment-form" class="recent-com"><i class="fa fa-comment"></i> 12 Comments</span></div></li> 

<% else %> 
No NEWS! 
<% end %> 

<% end %> 

    </ul> 
      </div> 

<div style="clear:both;"></div> 
<div class="index"> 

      <div id='main-wrapper'> 
       <div class='main section' id='main'> 
        <div class='widget Blog' data-version='1' id='Blog1'> 
        <div class='blog-posts hfeed'> 
         <% @articles.each do |article| %> 
         <% if article.is_published? %> 
         <div class="date-outer"> 
          <div class="date-posts"> 
           <div class='post-outer'> 
           <div class='wrapfullpost'> 
            <div class='post hentry'> 
             <a name='1001054977757960770'></a> 
             <div class='post-header-line-1'></div> 
             <div class='post-body entry-content'> 
              <div class='post-summary' id='summary1001054977757960770'> 
              <div dir="ltr" style="text-align: left;" trbidi="on"> 
               <div dir="ltr" style="text-align: left;" trbidi="on"> 
                <div class="separator" style="clear: both; text-align: left;"> 
                 <img border="0" src="<%= api_domain_image(article) %>" /> 
                </div> 
                <br /> 
               </div> 

               <div> 

               </div> 

              </div> 
              </div> 

              <h2 class='post-title entry-title pagetitle'> 
              <a href='<%= seofy_article_url(article) %>'><%= article.title.first(40) %>...</a> 
              </h2> 
              <div class='post-details'> 
              <span class='post-date'><i class='fa fa-calendar'></i> 
              <%= article_date(article) %></span> 
              <span class='post-label'><i class='fa fa-tags'></i> 
              <%= article.tags %></span> 
              </div> 
              <div style='clear: both;'></div> 
             </div> 
            </div> 
           </div> 
           </div> 

          </div> 
         </div> 
         <% end %> 
         <% end %> 
        </div> 

        </div> 
       </div> 
      </div> 
      <!-- end main wrapper --> 

     </div> 
     <!-- end content-wrapper --> 
     </div> 
    </div> 
    <!-- end outer-wrapper --> 
</div> 
</div> 

почему-то определения, которые я поставил, кажется, не имеют никакого влияния, потому что независимо от того, какие @news то же самое в @articles даже несмотря на то, что я установил то, что хочу, специально используя где.

ответ

1

Я понимаю, что вы хотите вернуть многопользовательский JSON, содержащий более одного типа ресурсов, статей, новостей и пользователей в вашем случае. И если я это правильно понимаю, вот фрагмент кода, который может вам помочь.

Предположим, у вас есть контроллер под названием manage_content.rb, напишите функцию внутри него.

def return_content 
    @articles = Article.where(:is_published => true).order('created_at DESC').page(params[:page]).per(6) 
    @news = Article.where(:news => true) 
    @users = User.all 
    # This is will create a single object with embedded arrays of your resource objects inside. 
    @content = { 
     articles: @articles, 
     news: @news, 
     users: @users 
    } 

    render json: { :data => @content, :status => 200 } 
end 

И в вашей конфигурации/routes.rb, добавьте соответствующий маршрут

get 'render_content' => "manage_content#return_content" 

испытания его обжигом localhost:3000/render_content с вашего Broswer. Это должно сделать вам JSON, как,

{ 
    data: 
    { 
     articles: [ 
      {.....}, 
      {.....} 
     ], 
     news: [ 
      {.....}, 
      {.....} 
     ], 
     users: [ 
      {.....}, 
      {.....} 
     ] 
    }, 
    status: 200 
} 

Помните, что статьи, пользователи и новости - массивы JSON. Имейте в виду массивы и объекты, анализируя ответ json на вашем интерфейсе.

С уважением.

+0

Спасибо, это работает! Теперь я получаю ожидаемые атрибуты Hash, получил ошибку «данных» на моем внешнем сайте, любую идею, как я могу это исправить? – RailsNewb

+0

Вы можете сделать console.log с вашего интерфейса и увидеть выход JSON? Я предполагаю, что HTTP уже имеет атрибут, называемый данными, и мы снова внедряем данные в наш контроллер. Вероятно, вы делаете .data в своем интерфейсе. Я думаю, что создание .data.data даст вам желаемый объект. После этого вы можете сделать .articles, .news и .users, чтобы получить отдельные массивы. Просьба принять ответ, если он сработает. –