Начинающий Rails, инициализация объекта - PullRequest
2 голосов
/ 01 октября 2010

В контроллере по умолчанию для rails новый метод создает объект, а метод create используется позже для его сохранения.

Я хочу установить поле 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 Если я помещу это в контроллер и модель, то получу nil объектные ошибки от ActiveRecord

  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

Ответы [ 5 ]

3 голосов
/ 01 октября 2010

Вы никогда не должны перезаписывать метод инициализации вашего объекта ActiveRecord.Rails делает кучу вещей за кулисами, и, как известно, все портит.

Вместо этого просто добавьте свой атрибут к исходным параметрам, которые вы передаете.

Итак, предположим: n_publisher_id - это реальный атрибут вашего объекта AR (столбец в таблице), что-то вроде:

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

должно работать.

Это также предполагает, что сессия [: n_publisher_id] также не равна нулю (в противном случае, конечно, она будет сохранена как ноль в БД)

2 голосов
/ 27 декабря 2011

Вы также можете вызвать super в вашем методе инициализации.

def initialize
  @something = false
  @value_you_set = 0
  super() # NOTE: This *must* be called
end
1 голос
/ 01 октября 2010

Удалите attr_accessor :n_publisher_id из вашей модели.Это столбец в БД, поэтому Rails позаботился об этом.Может быть, ваш attr_accessor перекрывает что-то.

0 голосов
/ 01 октября 2010

Звучит как session[:n_publisher_id] ноль.Или ты где-то перезаписываешь.

Если у вас есть значение, доступное в действии создания, объедините его с параметрами, и вам не нужно беспокоиться об установке его в новом действии.

Если оно доступно только вПо какой-то причине в новом действии используйте скрытое поле

В моей интуиции сказано, что вы должны установить это явным образом и фактически не разрешать массовое назначение, но я не знаю ваш вариант использования.

0 голосов
/ 01 октября 2010

Вы уже убедились, что сессия [: n_publisher_id] имеет значение! = Nil?

Быстрая проверка в вашем контроллере, попробуйте:

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

Если все вновь созданные страницыиметь n_publisher_id == 3, затем session [: n_publisher_id] == nil и должен быть установлен где-то в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...