Rails初学者,初始化对象

时间:2010-10-01 13:37:59

标签: ruby-on-rails ruby

在rails默认控制器中,new方法创建一个对象,稍后使用create方法来保存它。

我想在DB中设置一个mod_user字段,而不是将其输入到表单中。

基于此链接http://api.rubyonrails.org/classes/ActiveRecord/Base.html我尝试将以下内容添加到我的网页控制器中。

  def new
    @page = Page.new(:n_publisher_id => session[:n_publisher_id])

  def create
    page = Page.new(params[:page])
    page.n_publisher_id = session[:n_publisher_id]

但它保存为NULL 如果我把它放在控制器和模型中,那么我从ActiveRecord

获得nil对象错误
  def new
    @page = Page.new(1)

  def initialize(n_publisher)
    @n_publisher_id = n_publisher
  end

我的页面模型中包含attr_accessor:n_publisher_id。这适用于控制台......

>> @i = Page.new
=> #<Page id: nil, fk_issue: nil, n_status_id: nil, dt_published_datetime: nil, dt_offline_date: nil, dt_created_date: nil, n_publisher_id: nil, created_at: nil, updated_at: nil, page_name: nil>
>> @i.n_publisher_id
=> nil
>> @i.n_publisher_id = 1
=> 1
>> @i.n_publisher_id
=> 1

这是页面表的架构

mysql> show fields from pages;
+-----------------------+--------------+------+-----+---------+----------------+
| Field                 | Type         | Null | Key | Default | Extra          |
+-----------------------+--------------+------+-----+---------+----------------+
| id                    | int(11)      | NO   | PRI | NULL    | auto_increment |
| fk_issue              | int(11)      | YES  |     | NULL    |                |
| n_status_id           | int(11)      | YES  |     | NULL    |                |
| dt_published_datetime | datetime     | YES  |     | NULL    |                |
| dt_offline_date       | datetime     | YES  |     | NULL    |                |
| dt_created_date       | date         | YES  |     | NULL    |                |
| n_publisher_id        | int(11)      | YES  |     | NULL    |                |
| created_at            | datetime     | YES  |     | NULL    |                |
| updated_at            | datetime     | YES  |     | NULL    |                |
| page_name             | varchar(255) | YES  |     | NULL    |                |
+-----------------------+--------------+------+-----+---------+----------------+
10 rows in set (0.00 sec)

这是模型

class Page < ActiveRecord::Base
  has_many :slots, :dependent => :destroy
  accepts_nested_attributes_for :slots

  #attr_accessor :n_publisher_id
  #attr_accessible :n_publisher_id
end

创建动作

  def create
    page = Page.new(params[:page].merge({:n_publisher_id => 1}))
    #page.dt_created_date = Date.today

    page.n_publisher_id = 1

    respond_to do |format|
      if page.save
        format.html { redirect_to(page, :notice => 'Page was successfully created.') }
        format.xml  { render :xml => page, :status => :created, :location => page }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => page.errors, :status => :unprocessable_entity }
      end
    end
  end

4 个答案:

答案 0 :(得分:3)

您永远不应该覆盖ActiveRecord对象的initialize方法。 Rails在幕后做了很多事情,众所周知,它会搞砸。

相反,只需将您的属性附加到您传入的初始参数上。

因此,假设:n_publisher_id是AR对象的真实属性(表中的列),类似于:

@page = Page.new(params[:page].merge({:n_publisher_id => session[:n_publisher_id]}) 

应该有用。

这也假设session [:n_publisher_id]也不是nil(否则,它当然会在db中保存为nil)

答案 1 :(得分:1)

从模型中删除attr_accessor :n_publisher_id。它是db中的列,所以Rails会照顾它。也许你的attr_accessor会覆盖某些内容。

答案 2 :(得分:0)

您是否已验证会话[:n_publisher_id]是否有值!= nil?

在控制器中进行快速验证,请尝试:

def create
    page = Page.new(params[:page])
    page.n_publisher_id = 3
end

如果所有新创建的页面都有n_publisher_id == 3,那么会话[:n_publisher_id] == nil,必须在应用程序的某处设置。

答案 3 :(得分:0)

听起来session[:n_publisher_id]是零。或者你在某处覆盖它。

如果你在创建动作中有值,可以在那里合并参数,你不需要在新动作中设置它。

如果您出于某种原因只在新操作中使用它,请使用隐藏字段

我的直觉告诉我你应该明确地设置它,实际上不允许批量分配,但我不知道你的用例。