我想通过在ActiveRecord中定义属性来为属性创建默认值.默认情况下,每次创建记录时,我都想拥有属性的默认值:status.我试着这样做:
class Task < ActiveRecord::Base
def status=(status)
status = 'P'
write_attribute(:status, status)
end
end
Run Code Online (Sandbox Code Playgroud)
但是在创建时我仍然从数据库中检索此错误:
ActiveRecord::StatementInvalid: Mysql::Error: Column 'status' cannot be null
Run Code Online (Sandbox Code Playgroud)
因此我假设该值未应用于该属性.
在Rails中这样做的优雅方法是什么?
非常感谢.
我正在尝试找到在Rails中为对象设置默认值的最佳方法.
我能想到的最好的new方法是在控制器中设置方法的默认值.
如果可以接受或者有更好的方法,是否有人有任何意见?
在普通的java中我会使用:
public User(String name, String email) {
this.name = name;
this.email = f(email);
this.admin = false;
}
Run Code Online (Sandbox Code Playgroud)
但是,我在使用ActiveRecords的rails(3.2.3)中找不到简单的标准方法.
def initialize(attributes = {}, options = {})
@name = attributes[:name]
@email = f(attributes[:email])
@admin = false
end
Run Code Online (Sandbox Code Playgroud)
after_initialize回调通过覆盖它:
def after_initialize(attributes = {}, options = {})
...
end
Run Code Online (Sandbox Code Playgroud)
或者用宏:
after_initialize : my_own_little_init
def my_own_little_init(attributes = {}, options = {})
...
end
Run Code Online (Sandbox Code Playgroud)
但可能存在一些弃用问题.
那么,使用什么是正确/标准的方法?
在我的整个申请self.中,没有必要引用用户的名字.name工作良好.
为什么以下代码需要self按预期工作?
class User< ActiveRecord::Base
before_save :validate_name
def validate_name
if self.name.nil? || self.name.empty?
self.name= "Mr. No Name"
end
end
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我知道validates_presence_of可以用来阻止保存,但如果没有给出名字,我想保存默认值.
Rails 3.0.7.
class CreateCrews < ActiveRecord::Migration
def self.up
create_table :crews do |t|
t.string :title
t.text :description
t.boolean :adult
t.boolean :private
t.integer :gender_id
t.boolean :approved, :default => false
t.timestamps
end
end
def self.down
drop_table :crews
end
end
class Crew < ActiveRecord::Base
has_many :users, :through => :crew_users
belongs_to :user
default_scope where(:approved => true)
end
Run Code Online (Sandbox Code Playgroud)
当我进入控制台并创建新记录时,"已批准"属性设置为true,为什么?
如何将其自动设置为默认值(false),如我的迁移文件中所示?
wojciech@vostro:~/work/ze$ rails console
Loading development environment (Rails 3.0.0)
ruby-1.9.2-p0 > c = Crew.new
=> #<Crew id: nil, title: nil, description: nil, adult: nil, private: nil, gender_id: nil, approved: …
在一些地方,我看到声称重写ActiveRecord :: Base.initialize是错误的,因为它可能并不总是被调用:
从来没有版本的ActiveRecord(3.0+),这仍然是真的吗?如果是这样的话,具体的情况是什么时候人们可能会认为它会被调用?
显然我对铁轨很新,所以坚持下去.
我在我的模型中添加了一个构造函数
class Movie < Media
attr_accessible :director, :studio
attr_accessor :director, :studio
validates_presence_of :director, :studio, :title
def initialize title, director, studio
@title = title
@director = director
@studio = studio
end
end
Run Code Online (Sandbox Code Playgroud)
那种搞砸了我的东西.因为我在我的控制器中有一个方法'new'就像这样
def new
@movies = Movie.new
end
Run Code Online (Sandbox Code Playgroud)
并且在初始化出现之前它工作得很好.它需要将参数传递给'new'方法,但这是在视图打开后从用户传递参数并保存它们时完成的.现在我无法打开该视图,因为我收到错误
wrong number of arguments (0 for 3)
Run Code Online (Sandbox Code Playgroud)
添加构造函数是因为我开始为我的应用程序编写测试,并且为构造函数设置默认值会使该测试无效.解决这个问题的建议?
编辑:我的测试看起来像这样:
require 'spec_helper'
describe Movie do
before :each do
@movie = Movie.new "Bullet", "John", "20th"
end
describe "#{new}" do
it "returns new object of Movie" do
@movie.should be_an_instance_of Movie
end
it "throws …Run Code Online (Sandbox Code Playgroud) 我试图这样做,如果有人发一个没有标题的帖子,帖子将获得默认标题.
到目前为止我已经尝试过了
调节器
def create
@post = Post.create(post_params)
if @post.title.nil?
@post.update(:title => 'Unnamed')
else
# DO NOTHING
end
end
Run Code Online (Sandbox Code Playgroud)
调节器
def create
if params[:title].nil?
params[:title] == 'Unnamed'
@post = Post.create(post_params)
else
@post = Post.create(post_params)
end
end
Run Code Online (Sandbox Code Playgroud)
但它不起作用.什么想法我做错了什么?提前致谢.