2016-06-24 5 views
-1

Ich würde gerne in der Lage sein, mehrere Json Rendern in meinem Controller rendern. Ich habe eine Rails Json API mit dem Model Serializer Gem. Im Moment kann ich nur ein Objekt rendern. Ich möchte auch die @news und @users rendern, aber im Moment rendere ich nur die @articles.Rails Render Multiple in Controller mit Json API

Backend Artikel 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 Artikel 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-Website Artikel Modell:

require 'active_resource' 

class Article < ActiveResource::Base 
    self.site = "http://localhost:3000" 
end 

Frontend-Site Artikel Controller:

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-Website Artikel 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> 

Aus irgendeinem Grund die Definitionen, die ich gesetzt haben scheinen nicht beeinflussen zu haben, weil unabhängig von den @news was das gleiche bei @articles ist obwohl ich eingestellt habe, was ich wo speziell verwenden möchte.

Antwort

1

Ich verstehe, dass Sie ein mehrteiliges JSON mit mehr als 1 Art von Ressourcen, Artikeln, Nachrichten und Benutzern in Ihrem Fall zurückgeben möchten. Und wenn ich es richtig verstehe, hier ist ein Code, der Ihnen helfen könnte.

Nehmen wir an, Sie haben einen Controller namens manage_content.rb, schreiben Sie eine Funktion darin.

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 

Und in Ihrer config/routes.rb, fügen Sie die entsprechende Route

get 'render_content' => "manage_content#return_content" 

-Test durch localhost:3000/render_content von Ihrem broswer feuern. Dies sollte Ihnen ein JSON wie,

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

Remain, dass Artikel, Benutzer und Nachrichten sind JSON-Arrays. Berücksichtigen Sie die Arrays und Objekte beim Analysieren der JSON-Antwort an Ihrem Front-End.

Grüße.

+0

Danke, es funktioniert! Jetzt bekomme ich eine erwartete Hash-Eigenschaft, habe ["Daten" -Fehler auf meiner Frontend-Seite, irgendeine Idee, wie ich das beheben kann? – RailsNewb

+0

Können Sie eine console.log von Ihrem Front-End aus tun und die JSON-Ausgabe sehen? Meine Vermutung ist, dass HTTP bereits ein Attribut namens Daten hat und wir Daten wieder in unseren Controller einbetten. Sie tun wahrscheinlich eine .data in Ihrem Front-End. Ich denke, eine .data.data wird Ihnen das gewünschte Objekt bringen. Danach können Sie eine .articles, .news und .users erstellen, um die einzelnen Arrays zu erhalten. Bitte akzeptieren Sie die Antwort, wenn es funktioniert hat. –