Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails: Calling Model methods in to_json(:methods => [:model_method])

I've defined two methods in Model image_url & thumb_urlto get absolute url of images and thumbs and calling them in controller .to_json() method.

when I view the Json response it only shows image_url not the thumb_url please guide me what I am doing wrong here.

Model :

class Post < ActiveRecord::Base
  include Rails.application.routes.url_helpers

    validates :image, presence: true

      has_attached_file :image, styles: { :medium => "640x", thumb: "100x100#" } # # means crop the image
        validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/

  def image_url
   relative_path =  image.url(:medium)
   self.add_host_prefix relative_path
  end

 def thumb_url
   relative_path = image.url(:thumb)
   self.add_host_prefix relative_path
 end

  def add_host_prefix(url)
    URI.join(root_url, url).to_s
  end
end

controller :

class Api::ImagesController < ApplicationController

  def index
    @posts =  Post.all.order(id: :desc)
    paginated_records = @posts.paginate(:page => params[:page], :per_page => params[:per_page])
    @posts = with_pagination_info( paginated_records )
    render :json => @posts.to_json(:methods => [:thumb_url], :methods =>[:image_url])
  end
end

here is My Json Response:

"data": [{
"id": 23,
"caption": "World Top View",
"created_at": "2015-09-17T14:10:57.278Z",
"updated_at": "2015-09-17T14:10:57.278Z",
"image_file_name": "world.topo.bathy.200401.3x21600x10800.jpg",
"image_content_type": "image/jpeg",
"image_file_size": 29698041,
"image_updated_at": "2015-09-17T14:10:36.975Z",
"image_url": "http://localhost:3000/system/posts/images/000/000/023/medium/world.topo.bathy.200401.3x21600x10800.jpg?1442499036"}
like image 320
Kaleem Ullah Avatar asked Sep 21 '15 07:09

Kaleem Ullah


1 Answers

You can't pass two :methods keys into the hash, only the last key will be used. Remember that a key for a hash has to be unique. If you want mulitiple methods, you should do...

render :json => @posts.to_json(:methods => [:thumb_url, :image_url])
like image 166
SteveTurczyn Avatar answered Oct 23 '22 08:10

SteveTurczyn