Внешний ключ (class_id) не заполняется в ассоциации - PullRequest
4 голосов
/ 27 июня 2010

Я новичок в rails и создаю небольшое тестовое приложение на rails3 (бета4).

Я использую Authlogic для управления пользовательскими сессиями (стандартная настройка в этом уроке )

Я создал леса и настроил модель карты (в основном пост), а также настроил основные ассоциации активных записей для отношений belongs_to и has_many

user.rb

has_many :cards

card.rb

belongs_to :user

Я добавил свой столбец внешнего ключа в таблицу карточек: user_id по умолчанию 1

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

Но Я не могу удержать текущего активного пользователя при созданииновая карта

cards_controller.rb

def new
  @card = Card.new
  @card.user = current_user

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @card }
  end
end

current_user определена в контроллере приложения, доступна для просмотра здесь

user_id передает NULL и ничего не записывается в столбец user_id базы данных, оставляя значение по умолчанию 1 вместо идентификатора фактического пользователя, вошедшего в систему.

Я попробовал очевидноетакие вещи, как @user = current_user

Возможно, это что-то очень простое, но сегодня мой первый настоящий день с рельсами - Спасибо!

Ответы [ 2 ]

6 голосов
/ 27 июня 2010

Прямо сейчас это отображается, когда вы настраиваете пользователя для действия new, но не для действия create.

Я вижу 2 варианта, последний из которых лучше:

  1. Если вы продолжите оставлять @card.user = current_user в вашем действии new, вы можете установить скрытое поле вводаcard[user_id], который может содержать идентификатор текущего пользователя.Это очень плохая идея, потому что любой может просто бросить в это поле все, что он хочет.

  2. Попробуйте переместить @card.user = current_user прямо перед вашей линией @card.save в действии create.Таким образом, пользователь не может возиться с ним, и он установит его на объект вашей карты, когда он фактически будет сохранен.

3 голосов
/ 28 июня 2010

Распространенной идиомой Rails (в контроллерах RESTful) является создание экземпляра вашей Карты (@card) в новом действии, отображение представления в браузере, а затем сохранение этого объекта в базе данных в действии создания (при условиииметь промежуточный захват дополнительных данных карты от пользователя между этими действиями).Вы можете использовать ассоциации Rails для правильной сборки экземпляра карты с правильным пользователем.В Rails 3 введено упрощенное средство ответа, как показано здесь.

respond_to :html, :xml

def new
  respond_with(@card = current_user.cards.build)
end

def create
  @card = current_user.cards.new(params[:card])
  if @card.save
    respond_with(@card)
  else
    // Do something else to handle the error case....
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...