标签: activemodel

如何确定是否刚刚在after_save中创建或更新了记录

#new_record?function确定是否已保存记录.但它总是假的after_save.有没有办法确定记录是新创建的记录还是更新的旧记录?

我希望不要使用另一个回调,比如before_create在模型中设置一个标志或者需要另一个查询到db.

任何建议表示赞赏.

编辑:需要在after_save挂钩中确定它,对于我的特定用例,没有updated_atupdated_on时间戳

activerecord ruby-on-rails activemodel

93
推荐指数
7
解决办法
5万
查看次数

获取ActiveRecord对象中的属性类型

我想知道是否有可能以编程方式获取类型(如AR所知 - 例如在迁移脚本和数据库中)(我知道数据存在于某处).

例如,我可以处理所有属性名称:

ar.attribute_names.each { |name| puts name }
Run Code Online (Sandbox Code Playgroud)

.attributes只返回名称到其当前值的映射(例如,如果未设置字段,则不返回类型信息).

我在一些地方看到了类型信息:

在脚本/控制台中,键入AR实体的名称:

>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)
Run Code Online (Sandbox Code Playgroud)

很明显它知道类型.此外,还有.column_for_attribute,它接受一个attr名称并返回一个列对象 - 其类型隐藏在底层数据库列对象中,但它似乎不是一种干净的方式来获取它.

我也感兴趣的是,如果有一种方式对新的"ActiveModel"来说是友好的(rails3)并且与数据库细节分离(但也许类型信息不会是它的一部分,我似乎无法找出它是否是).

谢谢.

ruby activerecord ruby-on-rails activemodel

65
推荐指数
6
解决办法
4万
查看次数

LoadError无法自动加载常量消息

在我的应用程序; 当我提交表单时,我收到此错误:

LoadError at /questions
Unable to autoload constant Message, expected /app/models/message.rb to define it
Run Code Online (Sandbox Code Playgroud)

它指向控制器中的create动作Questions:

@message = current_user.messages.new(:subject => "You have a question from #{@question.sender_id}"`
Run Code Online (Sandbox Code Playgroud)

消息模型:

class Mailboxer::Message < ActiveRecord::Base
  attr_accessible :notification_id, :receiver_id, :conversation_id
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-models activemodel mailboxer

52
推荐指数
1
解决办法
6万
查看次数

控制导轨验证的顺序

我有一个rails模型,它有7个数字属性由用户通过表单填写.

我需要验证每个属性的存在,这显然很容易使用

validates :attribute1, :presence => true
validates :attribute2, :presence => true
# and so on through the attributes
Run Code Online (Sandbox Code Playgroud)

但是我还需要运行一个自定义验证器,它接受许多属性并用它们进行一些计算.如果这些计算的结果不在一定范围内,则应将模型声明为无效.

就它而言,这也很容易

validate :calculations_ok?

def calculations_ok?
  errors[:base] << "Not within required range" unless within_required_range?
end

def within_required_range?
  # check the calculations and return true or false here
end
Run Code Online (Sandbox Code Playgroud)

然而问题是方法"validate"总是在方法"验证"之前运行.这意味着如果用户将其中一个必填字段留空,则rails尝试使用空白属性进行计算时会抛出错误.

那么如何首先检查所有必需属性的存在?

validation ruby-on-rails activemodel ruby-on-rails-3

50
推荐指数
2
解决办法
2万
查看次数

活动模型,活动记录和活动资源之间的区别

是否有人可以通过定义活动模型,活动记录和活动资源之间的确切区别来帮助我.我已经做了足够的谷歌搜索,以找到确切的差异,但没有得到任何具体可以告诉他们之间的确切差异.现在他们看起来都和我一样.所以请给我一些具体的答案.

activeresource activemodel ruby-on-rails-3 rails-activerecord

50
推荐指数
3
解决办法
1万
查看次数

ActiveModel :: MissingAttributeError在部署后发生,然后在一段时间后消失

我有一个Rails 3.0.9应用程序,一旦部署,就会遇到一堆ActiveModel :: MissingAttributeErrors,它会突然出现500s.错误相当随机地发生,有时页面会加载,有时则不加载,但属性是数据库中的所有现有属性,应该找到.

奇怪的是,过了一会儿,错误消失了.突然,他们停止造成问题.

我已经搜索过这个解决方案,但是这个错误主要发生在某人已经完成Model.all(:select => 'column_x,column_y')并且正在调用column_z或者他们正在使用cache_money时.我不做这两件事.

有人可以帮忙吗?

ruby ruby-on-rails activemodel

47
推荐指数
2
解决办法
3万
查看次数

从模型中获取验证

我如何得到模型中定义的验证列表

例:

class ModelName
  validates_presence_of :field_name
  validates_inclusion_of :sex, :in => %w(M F)
end
Run Code Online (Sandbox Code Playgroud)

我需要哈希像:

{:field_name => 'required', :sex => 'Must be in: M, F'}
Run Code Online (Sandbox Code Playgroud)

validation ruby-on-rails activemodel

41
推荐指数
1
解决办法
8360
查看次数

Rails 4中的禁用属性错误遇到在早期版本的Rails中使用attr_accessible的情况

随着最近升级到Rails 4,使用类似下面的代码更新属性不起作用,我收到一个ActiveModel::ForbiddenAttributes错误:

@user.update_attributes(params[:user], :as => :admin)
Run Code Online (Sandbox Code Playgroud)

用户在模型中具有以下attr_accessible行:

attr_accessible :role_ids, :as =>admin
# or any attribute other than :role_ids contained within :user
Run Code Online (Sandbox Code Playgroud)

你如何在Rails 4中完成同样的任务?

ruby-on-rails attr-accessible activemodel strong-parameters ruby-on-rails-4

39
推荐指数
4
解决办法
6万
查看次数

如何测试自定义验证器?

我有以下验证器:

# Source: http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators
# app/validators/email_validator.rb

class EmailValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
      object.errors[attribute] << (options[:message] || "is not formatted properly") 
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我希望能够在我的lib目录中的RSpec中测试它.到目前为止的问题是我不知道如何初始化EachValidator.

testing validation rspec ruby-on-rails activemodel

36
推荐指数
4
解决办法
2万
查看次数

如何使用ActiveModel :: Serializers为同一模型实现多个不同的序列化器?

假设您正在Rails中实现REST API.提供集合时,您可能只想包含一些属性:

/people
Run Code Online (Sandbox Code Playgroud)

但是,当提供单个资源时,您希望包含所有属性:

/people/1
Run Code Online (Sandbox Code Playgroud)

我没有看到如何使用ActiveModel :: Serializers,因为这些示例都使用每个模型定义一个序列化程序的模式(使用标准命名约定),并且当您执行以下操作时AMS会自动使用控制器中的正确模式:

render json: @people
Run Code Online (Sandbox Code Playgroud)

要么:

render json: @person
Run Code Online (Sandbox Code Playgroud)

rest json activemodel ruby-on-rails-3

36
推荐指数
3
解决办法
2万
查看次数