Создание вложенного ресурса в Rails 5 - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь создать вложенный ресурс, чтобы продукты могли иметь заметки, связанные с ними. Я установил связи внутри модели и т. Д., Но когда я пытаюсь использовать форму для создания новой заметки, я получаю следующую ошибку:

NoMethodError in Notes#create
Showing /Users/myusername/myapp/app/views/notes/_form.html.erb where line #2 raised:

undefined method `notes_path' for #<#<Class:0x00007fb3630b1ad0>:0x00007fb361eab868>

Это строка, к которой она относится:

<%= simple_form_for [@product, @note] do |f| %>

Это новые действия & create в контроллере заметок:

  def new
    @product = Product.find(params[:product_id])
    @note = @product.notes.build
  end

def create
    @note = Note.new(product: @product)

    respond_to do |format|
      if @note.save
        format.html { redirect_to product_notes, notice: 'Note was successfully created.' }
      else
        flash.now[:error] = "It doesnt work"
        render 'new'
      end
    end
  end

и частичная форма:

<%= simple_form_for [@product, @note] do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="form-inputs">
    <%= f.input :content %>
    <%= f.input :author %>
    <%= f.check_box :visible %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

Я хожу по кругу с внесением изменений и, похоже, не могу найти никакой документации по вложенным ресурсам, которая не считается устаревшей. Кто-нибудь может помочь, пожалуйста?

Отредактировано, чтобы добавить:

Я изменил действие моего контроллера на что-то, основываясь на ответе PGill, и теперь могу загрузить страницу без ошибки контроллера действий. Однако теперь он повторно отображает новую форму заметки с ошибками, указывающими, что поля формы не могут быть пустыми. Они не были пустыми, когда я отправил их - что происходит, чтобы вызвать это?

Обновлено действие контроллера:

def create
    @product = Product.find(params[:product_id])
    @note = @product.notes.new

    respond_to do |format|
      if @note.save
        format.html { redirect_to product_notes_path(@product), notice: 'Note was successfully created.' }
      else
        format.html { render :new, notice: 'Note failed to be created.' }
      end
    end
  end

Когда я ранее получал ошибки, он имел это в качестве параметров запроса, поэтому они передаются?

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"lotsofletters",
 "note"=>{"content"=>"test", "author"=>"test", "visible"=>"0"},
 "commit"=>"Create Note",
 "product_id"=>"1"}

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Ссылаясь на ваше редактирование; конечно, вы должны получить пустые поля с ошибками, потому что вы создаете новый объект @note, не предоставляя ему никаких атрибутов:

  @note = @product.notes.new

должно быть как

@note = @product.notes.build(params[:note])

также позаботьтесь о том, чтобы обеспечить дезинфицирующее средство для заметок в контроллере заметок:

private 

def note_params
   params.require(:note).permit(:content, :author, :visible, :product_id)
end

поэтому ваш код в create будет выглядеть так:

def create
  @product = Product.find(params[:product_id])
  @note = @product.notes.build(note_params)

  respond_to do |format|
    if @note.save
      format.html { redirect_to product_notes_path(@product), notice: 'Note was successfully created.' }
    else
      flash.now[:error] = "It doesnt work"
      render 'new'
    end
  end
end

private 

def note_params
   params.require(:note).permit(:content, :author, :visible, :product_id)
end
0 голосов
/ 18 ноября 2018

@product равно nil в create

Ваша форма не проходит проверки и рендеринг new

обновить действие создания до

def create
  @product = Product.find(params[:product_id])
  @note = @product.notes.new

  respond_to do |format|
    if @note.save
      format.html { redirect_to product_notes_path(@product), notice: 'Note was successfully created.' }
    else
      flash.now[:error] = "It doesnt work"
      render 'new'
    end
  end
end

redirect_to должно быть product_notes_path(@product) примечания # индекс

...