2013-03-04 46 views
0

我有了很多帖子故事模型的關聯對象:如何包括在渲染動作

story.rb

has_many  :posts, :dependent => :destroy 

post.rb

belongs_to :story, :touch => true 

我使用AJAX來使一個獲取我的stories#index動作的請求,並且在該動作中,我生成一個響應,其中包含符合我的搜索參數的故事數組。我包括我的回答一些額外的數據,如是否有一個current_user,並通過我的搜索尋找的故事日期:

def index 
    ajax_response = {} 
    ajax_response[:currentUser] = user_signed_in? ? current_user : "no current user" 
    searched_through_date = Stories.last.created_at 
    @stories = get_stories(params,searched_through_date) 
    if @stories && @stories.length << 200 
     ajax_response[:stories] = @stories 
     ajax_response[:searched_through_date] = searched_through_date 
    else #only happens if there are too many responsive stories 
     ajax_response[:error] = {:type => "Response too large", :number_of_stories => @stories.length } 
    end 
    render :json => ajax_response 
    end 

現在我想改變的響應,使每個故事,我返回還有一個附加屬性:latest_post,它由屬於該故事的最新帖子組成。作爲一個相對的nOOb,我無法修改故事對象,以便它們包含這個新的屬性/關聯,然後將其與故事對象一起呈現爲響應的一部分。

任何幫助將不勝感激!

編輯:

這裏是get_stories方法的相關部分:

def get_stories(params) 
    q = get_story_search_params(params) 
    Story.search_with_params(q).limit(q[:limit]).offset(q[:offset]) 
    end 

    def get_story_search_params(params) 
    q = {} 
    q[:limit] = params[:limit].blank? ? 25 : params[:limit].to_i 
    q[:text_to_search] = params[:text_to_search].blank? ? nil : params[:text_to_search] 
    q[:offset] = params[:offset].blank? ? 0 : params[:offset] 
    return q 
    end 
+0

你或許應該包括你的'get_stories'方法的代碼,因爲這就是產生'@ stories'集合(這是你想修改什麼)。 – MrTheWalrus 2013-03-04 21:53:36

+0

我將編輯問題以包含代碼,但該方法僅返回一個故事對象數組。 @MrTheWalrus指出我想修改該數組中的故事對象是正確的。 – 2013-03-04 23:25:52

回答

0

我解決了這個問題與Rabl的寶石的幫助。使用正確的DSL語法證明了一點點的反覆試驗。關鍵是在stories/index.json.rabl視圖中使用object false,並很好地使用了拉布爾偏壓。希望它可以幫助別人,我已經在此附上了我的工作代碼。

#stories/index.json.rabl 

object false 

node(:currentUser) do 
    if user_signed_in? 
    partial('users/show', :object => current_user) 
    else 
    "no current user" 
    end 
end 

node(:stories) do 
    partial('stories/list', :object => @stories) 
end 

node(:searched_through_date) { |m| @searched_through_date } 

#stories/show.json.rabl 

object @story 

attributes :address, :category, :created_at, :username 

node :latest_post do |story| 
    { :post => partial("posts/show", :object => story.posts.first) } 
end 

#stories/list.json.rabl 

collection @stories, :object_root => "story" 

extends "stories/show" 

#user/show.json.rabl 

object @user 

node :user do |u| 
    { :email => u.email, :username => u.username, :preferred_post_to_facebook => u.preferred_post_to_facebook, 
    :preferred_tweet_to_twitter => u.preferred_tweet_to_twitter, :home_address => u.home_address, 
    :home_lat => u.home_lat, :home_lng => u.home_lng, :suspended => u.suspended } 
end