相关疑难解决方法(0)

如何在Rails activerecord模型中为属性创建默认值?

我想通过在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中这样做的优雅方法是什么?

非常感谢.

activerecord ruby-on-rails

190
推荐指数
9
解决办法
19万
查看次数

如何在Rails中设置默认值?

我正在尝试找到在Rails中为对象设置默认值的最佳方法.

我能想到的最好的new方法是在控制器中设置方法的默认值.

如果可以接受或者有更好的方法,是否有人有任何意见?

ruby ruby-on-rails

104
推荐指数
8
解决办法
10万
查看次数

如何使用Rails中的值初始化ActiveRecord?

在普通的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)中找不到简单的标准方法.

1.覆盖初始化

def initialize(attributes = {}, options = {})
  @name  = attributes[:name]
  @email = f(attributes[:email])
  @admin = false
end
Run Code Online (Sandbox Code Playgroud)

但是从DB创建记录时可能会错过

2.使用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)

但可能存在一些弃用问题.

SO中还有其他一些链接,但它们可能已过时.


那么,使用什么是正确/标准的方法?

activerecord ruby-on-rails ruby-on-rails-3.2

25
推荐指数
3
解决办法
5万
查看次数

为什么使用"self"访问ActiveRecord/Rails模型属性?

在我的整个申请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.

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

12
推荐指数
1
解决办法
6353
查看次数

rails3 default_scope,以及迁移中的默认列值

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: …

migration ruby-on-rails default-scope ruby-on-rails-3

10
推荐指数
1
解决办法
6660
查看次数

为什么重写ActiveRecord :: Base.initialize错误?

在一些地方,我看到声称重写ActiveRecord :: Base.initialize是错误的,因为它可能并不总是被调用:

从来没有版本的ActiveRecord(3.0+),这仍然是真的吗?如果是这样的话,具体的情况是什么时候人们可能会认为它会被调用?

activerecord overriding ruby-on-rails ruby-on-rails-3

5
推荐指数
1
解决办法
3353
查看次数

rails将参数传递给'new'方法

显然我对铁轨很新,所以坚持下去.

我在我的模型中添加了一个构造函数

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)

parameters ruby-on-rails

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

如果params [:object] .nil?:object = value

我试图这样做,如果有人发一个没有标题的帖子,帖子将获得默认标题.

到目前为止我已经尝试过了

调节器

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)

但它不起作用.什么想法我做错了什么?提前致谢.

ruby ruby-on-rails ruby-on-rails-4

0
推荐指数
1
解决办法
515
查看次数