首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails初学者,初始化对象

Rails初学者,初始化对象
EN

Stack Overflow用户
提问于 2010-10-01 21:37:59
回答 5查看 7.6K关注 0票数 2

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

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

基于这个链接http://api.rubyonrails.org/classes/ActiveRecord/Base.html,我尝试将以下代码添加到我的页面控制器中。

代码语言:javascript
复制
  def new
    @page = Page.new(:n_publisher_id => session[:n_publisher_id])

代码语言:javascript
复制
  def create
    page = Page.new(params[:page])
    page.n_publisher_id = session[:n_publisher_id]

但是如果我把它放到控制器和模型中,那么我从ActiveRecord得到的对象错误是零

代码语言:javascript
复制
  def new
    @page = Page.new(1)

  def initialize(n_publisher)
    @n_publisher_id = n_publisher
  end

我的页面模型中包含了attr_accessor :n_publisher_id。这在控制台中有效...

代码语言:javascript
复制
>> @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

下面是pages表的模式

代码语言:javascript
复制
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)

这是模型

代码语言:javascript
复制
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

创建操作

代码语言:javascript
复制
  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
EN

回答 5

Stack Overflow用户

发布于 2010-10-01 21:51:55

永远不要重写ActiveRecord对象的初始化方法。Rails在幕后做了一大堆事情,众所周知,它会把事情搞砸。

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

因此,假设:n_publisher_id是AR对象(表中的列)的真实属性,如下所示:

代码语言:javascript
复制
@page = Page.new(params[:page].merge({:n_publisher_id => session[:n_publisher_id]}) 

应该行得通。

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

票数 3
EN

Stack Overflow用户

发布于 2011-12-27 17:03:32

你也可以在你的初始化方法中调用super。

代码语言:javascript
复制
def initialize
  @something = false
  @value_you_set = 0
  super() # NOTE: This *must* be called
end
票数 2
EN

Stack Overflow用户

发布于 2010-10-01 22:24:47

从模型中删除attr_accessor :n_publisher_id。它是db中的列,所以Rails会处理它。也许你的attr_accessor覆盖了一些东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3839689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档