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!

idについての質問

解決したいこと

Ruby on Railsでwebアプリをつくっています。
各記事の詳細を表示する際にエラーが発生しました。
解決方法を教えて下さい!

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

image.png

該当するソースコード

app/controllers/companies_controller.rb

class CompaniesController < ApplicationController
  before_action :authenticate_user!
  before_action :move, only: [:show,  :index, :edit, :update, :destroy]
  before_action :prohibit, only: [:edit, :update, :destroy]

  def index
    @companies = Company.all.order("created_at DESC")
  end

  def new
    @company = Company.new
  end

  def create
    @company = Company.new(company_params)
    if @company.save
      redirect_to user_companies_path(current_user)
    else
      render :new
    end
  end

  def show
  end

  def edit 
  end


  def update 
    if @company.update(company_params)
      redirect_to user_companies_path(current_user)
    else
      render :edit
    end
  end

  def destroy
    if @company.destroy
      redirect_to user_path(current_user)
    else
      render :show
    end
  end

  
  private

  def company_params
    params.permit(:company_name, :explanation, :date).merge(user_id: current_user.id)
  end

  def move 
    @company = Company.find(params[:user_id])
  end

  def prohibit
    redirect_to interns_index_path unless current_user.id == @company.user_id 
  end
end

app/views/companies/index.html.erb

    <% @companies.each do |company| %>
      <ul>
        <li class='list'> 
               
                  <div class='intern-info'>
                    <h3 class='company-name'>
                      <%= company.company_name %>    
                    </h3>

                    
                    <ul class="more_list">
                      <% if user_signed_in? %>   
                        <% if current_user== company.user %>
                          <li>
                            <%= link_to '詳細 👀', user_company_path(company.id), method: :get %>
                          </li>
                          <li> 
                            <%= link_to '編集 📝', edit_user_company_path(company.id), method: :get %>
                          </li>   
                          <li>
                            <%= link_to '削除 ❌', user_company_path(company.id), method: :delete %>
                          </li>  
                        <% end %>
                      <% end %>
                    </ul>  

                    <div class='company-date'>
                      <span><%= company.date %></span> 
                    </div> 
                  </div>  
        </li>
      </ul>
    <% end %>    

config/routes.rb

resources :users, only: [:show] do
    resources :companies
  end

解決させたいこと

解決させたいことは、user_idの値を1に、company_idの値を25にして、views/companies/index.html.erbにおいてcompany.idのidがcompany_idとして受け取られるようにすることです。

自分で考えたこと

エラー画像によると、parametersではuser_idが1である(画像の一番下に書いてある)のに対し、エラー文では25として受け取られています。25というのは各記事(company)のidの値を指し示しています。このことから、user_idが1のはずが、各記事のid(company_id)になっていることがエラーの原因だと考えました。この理由として、config/routes.rbにおいて各記事(company)とuserが入れ子構造になっているためだと考えました。

さまざまな教科書やインターネットを参考にして、company_idの取得を試みましたが、うまくいきませんでした。解決方法があればご教授いただきたいです。🙇‍♀️

0

1Answer

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313937323736332f39393339643332612d363630332d363064632d336239342d3864653233356335393938312e706e67__2384×1052_.png

No route matches ...

とエラーの内容が表示されていて

missing required keys [:id]

ともあります。これがほぼ答えですが、routeの理解が必要です。

# 指定userの
resources :users, only: [:show] do
  # 中のcompany
  resources :companies
end

...
...

# companyしか指定してない
user_company_path(company.id)
# user_company_path(current_user.id, company.id) 多分こう

いちいちアプリケーションを走らせて、エラーがでて、エラーを直して...というサイクルは手間だし、エラーの箇所がわかりにくいので

$ rails c

> user = User.find(...)
> company = Company.find(...)
# appはrails consoleで勝手に用意されている
> app.user_company_path(user.id, company.id)

こういう風にrails consoleでテストして問題がなければviewに組み込むようにすると見通しやすいと思います。

appメソッドを使うと、名前付きルーティングヘルパーにアクセスできます。

1Like

Comments

  1. @mina121

    Questioner

    なるほど。ありがとうございます。idを2つ指定するべきだったのですね。rails cで調べるという方法を使ってこれからは挙動を確かめたいと思います。手間も時間も省けていい方法ですね!
    お答えいただきありがとうございます !!!

Your answer might help someone💌