#new_record?function确定是否已保存记录.但它总是假的after_save
.有没有办法确定记录是新创建的记录还是更新的旧记录?
我希望不要使用另一个回调,比如before_create
在模型中设置一个标志或者需要另一个查询到db.
任何建议表示赞赏.
编辑:需要在after_save
挂钩中确定它,对于我的特定用例,没有updated_at
或updated_on
时间戳
我想知道是否有可能以编程方式获取类型(如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)并且与数据库细节分离(但也许类型信息不会是它的一部分,我似乎无法找出它是否是).
谢谢.
在我的应用程序; 当我提交表单时,我收到此错误:
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) 我有一个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尝试使用空白属性进行计算时会抛出错误.
那么如何首先检查所有必需属性的存在?
是否有人可以通过定义活动模型,活动记录和活动资源之间的确切区别来帮助我.我已经做了足够的谷歌搜索,以找到确切的差异,但没有得到任何具体可以告诉他们之间的确切差异.现在他们看起来都和我一样.所以请给我一些具体的答案.
activeresource activemodel ruby-on-rails-3 rails-activerecord
我有一个Rails 3.0.9应用程序,一旦部署,就会遇到一堆ActiveModel :: MissingAttributeErrors,它会突然出现500s.错误相当随机地发生,有时页面会加载,有时则不加载,但属性是数据库中的所有现有属性,应该找到.
奇怪的是,过了一会儿,错误消失了.突然,他们停止造成问题.
我已经搜索过这个解决方案,但是这个错误主要发生在某人已经完成Model.all(:select => 'column_x,column_y')
并且正在调用column_z
或者他们正在使用cache_money时.我不做这两件事.
有人可以帮忙吗?
我如何得到模型中定义的验证列表
例:
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) 随着最近升级到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
我有以下验证器:
# 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
.
假设您正在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) activemodel ×10
validation ×3
activerecord ×2
ruby ×2
json ×1
mailboxer ×1
rails-models ×1
rest ×1
rspec ×1
testing ×1