genryong
@genryong (gen)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Ruby on Railsでform_withでモデルを複数渡したいんですが、エラーが出ます。

解決したいこと

Ruby on Railsで投稿にコメントをする機能を実装しているのですが、form_withで複数のモデルを渡したいんですがエラーが出ます。

発生している問題・エラー

スクリーンショット 2021-04-20 22.39.46.png

ActionView::Template::Error (undefined method `answer_photo_path' for #<#<Class:0x00007fa1981102b0>:0x00007fa1980b71d8>
Did you mean?  new_photo_path):

該当するソースコード

routes.rb
Rails.application.routes.draw do
  resources :photos
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root to: 'toppages#index'

  get 'login', to: 'sessions#new'
  post 'login', to: 'sessions#create'
  delete 'logout', to: 'sessions#destroy'

  get 'signup', to: 'users#new'
  resources :users, only: [:index, :show, :create]
  resources :photos
  resources :answers, only: [:create]
end

photos_controller.rb
class PhotosController < ApplicationController
  before_action :set_photo, only: %i[ show edit update destroy ]


  def index
    @photos = Photo.all
  end


  def show
    @answer = Answer.new
    @photo = Photo.find(params[:id])
    @answers = @photo.answers
  end


  def new
    @photo = Photo.new
  end


  def edit
  end


  def create
    @photo = current_user.photos.new(photo_params)

    if @photo.save
      flash[:success] = '投稿に成功しました。'
      redirect_to photos_path
    else
      flash.now[:danger] = "投稿に失敗しました。"
      render :new
    end
  end


  def update
    respond_to do |format|
      if @photo.update(photo_params)
        format.html { redirect_to @photo, notice: "Photo was successfully updated." }
        format.json { render :show, status: :ok, location: @photo }
      else
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @photo.errors, status: :unprocessable_entity }
      end
    end
  end


  def destroy
    @photo.destroy
    respond_to do |format|
      format.html { redirect_to photos_url, notice: "Photo was successfully destroyed." }
      format.json { head :no_content }
    end
  end

  private

    def set_photo
      @photo = Photo.find(params[:id])
    end


    def photo_params
      params.require(:photo).permit(:image, :content)
    end
end
answers_controller.rb
class AnswersController < ApplicationController

  def create
    @photo = Photo.find(params[:photo_id])
    @answer = @photo.answer.new(answer_params)
    if @answer.save
      redirect_to photo_path(@photo)
    else 
      flash.now[:alert] = 'コメント入力してください。'
    end
  end

  private

  def answer_params
    params.require(:answer).permit(:content, :photo_id)
  end
end
photos/show.html.erb
<p id="notice"><%= notice %></p>
<div class="row">
  <div class="offset-md-3 col-md-5">
    <p>

      <%= image_tag @photo.image.url if @photo.image? %>
    </p>

    <p>
      <strong>クイズの問題:</strong>
      <%= @photo.content %>
    </p>
    <p>
      <%= form_with(model:[@answer, @photo], method: :post) do |f| %>
      <div class="form-group">
          <%= f.text_area :content, class: 'form-control', rows: 5 %>
      </div>
        <%= f.submit 'Post', class: 'btn btn-primary btn-block' %>
      <% end %>
    </p>
    </div>
</div>

<%= link_to '戻る', photos_path %> |
<%= link_to '編集', edit_photo_path(@photo) %> 

自分で試したこと

モデルの指定をモデルのインスタンスではなくurlで指定などしてみたんですが、うまくいきません。
足りないコードがあれば載せます。ご教授お願いします。

0

2Answer

スクリーンショットでは undefined local variable or method `new_anwsers_path' エラーが出ています。その下で引用されている undefined method `answer_photo_path' はまた別のエラーです。どちらにしても複数のモデルを渡すコードとは関係ない場所で出ています。

質問を書くときいくつかのエラーを混同されたのではないでしょうか。もう一度エラーが出る様子を再現してみて、その情報を質問に載せ直してください。

0Like

関係ない場所で出ているエラーを直したとしても form_with(model: [@answer, @photo]) は実行できません。 form_with には1つのモデルしか渡せないからです。 Answer モデルに Photo モデルを紐付けたいなら以下のように f.hidden_fieldphoto_id パラメータを渡してやるといいでしょう。

      <%= form_with(model: @answer, method: :post) do |f| %>
      <div class="form-group">
          <%= f.text_area :content, class: 'form-control', rows: 5 %>
          <%= f.hidden_field :photo_id, @photo.id %>
      </div>
        <%= f.submit 'Post', class: 'btn btn-primary btn-block' %>
      <% end %>
0Like

Comments

  1. @genryong

    Questioner

    ありがとうございます。解決しました。

Your answer might help someone💌