【问题标题】:Hiding Rails Model Attributes隐藏 Rails 模型属性
【发布时间】:2011-07-17 22:49:16
【问题描述】:

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

如您所见,我经常重复自己。我很想通过模型使这些(并且只有这些)属性可用,但找不到合适的解决方案。有什么东西可以保护属性不被大量写入吗?或者我可能是指大众阅读?

如下面的 cmets 中所述,我想要一个具有 namei_am_private 属性的模型。当我将该模型渲染为 json - render :json => @model - 我只想显示 name

红宝石 1.8.7 导轨 3

【问题讨论】:

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


【解决方案1】:

为防止批量分配,请将以下内容添加到您的模型中:

  attr_accessible :attr1, :attr2, :attr3

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

【讨论】:

  • 反对大规模分配,但不反对大规模写作。因此,如果我有private_attr 不想在使用render :json => @object 时出现,attr_accessable :private_attr 将不起作用。
【解决方案2】:

在你的 Group 模型中重写 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

【讨论】:

  • 啊哈。覆盖!为什么要简单。非常感谢。
猜你喜欢
  • 2015-01-14
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-05
相关资源
最近更新 更多