Проверен: недефиниран метод, „свързан“ за 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
@Damien, въпреки че това изглежда малко странно.   -  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