隐藏Rails模型属性

时间:2011-03-18 06:20:19

标签: ruby-on-rails ruby api ruby-on-rails-3

我有一个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

正如你所看到的,我正在重复自我。我希望通过模型提供这些(并且只有这些)属性,但找不到合适的解决方案。是否有什么可以保护大众写作的属性?或者我可能是指大众阅读?

如下面的评论中所述,我希望拥有一个包含属性namei_am_private的模型。当我将该模型渲染为json - render :json => @model时 - 我只想显示name

Ruby 1.8.7 Rails 3

2 个答案:

答案 0 :(得分:14)

如何在组模型中覆盖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

答案 1 :(得分:2)

要防止质量分配,请将以下内容添加到模型中:

  attr_accessible :attr1, :attr2, :attr3

其中attr1,attr2,attr3等是您要允许进行质量分配的属性,该模型的其余属性将不允许进行质量分配。