Атрибуты модели Hiding Rails - PullRequest
2 голосов
/ 18 марта 2011

У меня есть контроллер для API, который выглядит следующим образом:

def index
  respond_to   do |format|
    format.json  { render :json => @groups.to_json(:only => [:id, :name, :description, :created_at, :updated_at])}
  end
end

def show
  respond_to   do |format|
    format.json  { render :json => @group.to_json(:only => [:id, :name, :description, :created_at, :updated_at]) }
  end
end

# @todo add store to item
def create
  if @group.save
    render :json => @group.to_json(:only => [:id, :name, :description, :created_at, :updated_at])
  else
    render :status => 406
  end
end

def update
  if @group.update_attributes(params[:group])
    render :json => @group.to_json(:only => [:id, :name, :description, :created_at, :updated_at])
  else
    render :status => 406
  end
end

def destroy
  @group.destroy
  render :text => ""
end

Как видите, я много раз повторяю себя.Я бы хотел сделать эти (и только эти) атрибуты доступными через модель, но не смог найти подходящего решения.Есть ли что-нибудь, чтобы защитить атрибуты от массового письма?Или я имею в виду массовое чтение?

Как отмечено в комментариях ниже, я хочу иметь модель с атрибутами name и i_am_private.Когда я отображаю эту модель как json - render :json => @model - я хочу показать только name.

Ruby 1.8.7 Rails 3

Ответы [ 2 ]

14 голосов
/ 18 марта 2011

Как насчет переопределения метода as_json в модели вашей группы?

class Group < ActiveRecord:Base
  ...
  def as_json(options={})
    {
      :id => id,
      :name => name,
      :description => description,
      :created_at => created_at,
      :updated_at => updated_at
    }
  end
end
2 голосов
/ 18 марта 2011

Чтобы предотвратить массовое назначение, добавьте в свою модель следующее:

  attr_accessible :attr1, :attr2, :attr3

, где attr1, attr2, attr3 и т. Д. - это атрибуты, которые вы хотите разрешить для массового назначения, остальные атрибуты дляэта модель не будет допущена к массовому присвоению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...