Проверено: неопределенный метод «связан» для nil:NilClass

Итак, у меня есть модель Entry со столбцом с именем created_by, который я хотел бы использовать по умолчанию для первого User, создавшего запись. Я установил проверенный и в моей модели Entry у меня есть:

belongs_to :user
audited :associated_with => :user

Точно так же в моей модели User у меня есть следующие утверждения:

has_many :entries     
has_associated_audits

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

undefined method `associated' for nil:NilClass

Вот код в представлении:

 .field
   = f.label :created_by
 %br
   = f.hidden_field :created_by, value: @entry.audits.first.associated

А вот код в entries_controller, где я установил @entry в представлении:

  def new
    @entry = Entry.new
    authorize! :create, @entry

    @project = Project.find(params[:project_id])
    @entry.project_id = @project.id
    authorize! :update, :read, @project
  end

Я понимаю, что интуитивно не имеет особого смысла вызывать @entry.audits в случае создания нового аудита, так как он еще не сохранен. Должен ли я установить значение @entry.created_by после вызова @entry.save в методе create контроллера? Не совсем уверен, какой подход здесь наиболее практичный.

Спасибо,

Майкл.


person Thalatta    schedule 28.08.2013    source источник
comment
@Damien Я думаю, что всегда бывает так, что @entry.audits будет нулевым, если @entry = Entry.new и еще не сохранен. Это заставляет меня задаться вопросом, где лучше всего установить поле created_by, если не в момент создания @entry. Я предположил, что могу обернуть материал hidden_field if @entry.audits, и в этом случае я мог бы, предполагая, что запись уже была создана, установить значение created_by к тому, что я хочу, чтобы это было.   -  person Thalatta    schedule 29.08.2013
comment
@ Дэмиен, хотя это кажется немного шатким.   -  person Thalatta    schedule 29.08.2013
comment
Я согласен, что вам не следует устанавливать атрибут created_by в форме, устанавливайте его из контроллера перед @entry.save. Нет необходимости сохранять запись, чтобы получить пользователя, вы должны знать, кто этот пользователь через current_user. Вы можете добавить проверки обратного вызова, чтобы убедиться, что это так.   -  person Damien Roche    schedule 29.08.2013


Ответы (1)


Что бы я сделал, так это удалил скрытое поле created_by из формы (которое легко перехватывается) и вместо этого установил из контроллера перед сохранением entry с помощью current_user (или альтернативы) для доступа к пользователю, создающему запись.

def create_entry
  @entry.created_by = current_user
  @entry.save
end

Я бы не считал важным назначать пользователя created_by после того, как аудит был сохранен через @entry.audits.first.associated, потому что эти аудиты должны быть связаны с одним и тем же current_user. Если это не так, у вас большие проблемы.

person Damien Roche    schedule 28.08.2013