programmerOKADA
@programmerOKADA (岡田)

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!

Routing Errorが解決できない!!

コントローラーも作って記述もしたはず…

Ruby on RailsでECサイトをつくっています。
実際にindexのviewページが作れているかを確認しようと思い、URLを打ち込んでみたら下記のエラーが出ました。ページが表示されるようにしたいのですがうまくいきません。
解決方法を教えて下さい。

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

Routing Error
No route matches [GET] "/admins/customers"

routes.rbの記述

Rails.application.routes.draw do

  root 'homes#top'

  devise_for :admins

  get 'about' => 'homes#about', as: 'about'

  # 管理者側のルーティング設定
  namespace :admin do
    resources :order_details, only: :update
    resources :orders, only: [:index, :show, :update]
    resources :categories, only: [:index, :create, :edit, :update]
    resources :customers, only: [:index, :show, :edit, :update]
    resources :items, except: :destroy
  end

  #会員側のルーティング設定
  resources :addresses, except: [:show, :new]

  resources :orders, except: [:edit, :update, :destroy]
  get 'orders/confirm' => 'orders#confirm', as: 'confirm'
  get 'orders/complete' => 'orders#complete', as: 'complete'

  resources :cart_items, except: [:show, :new, :edit]
  delete '/:id' => 'cart_items#all_destroy'

  resources :items, only: [:index, :show]

  resources :customers, only: [:show, :edit, :update]
  get 'customers/unsubscribe' => 'customers#unsubscribe', as: 'unsubscribe'
  patch '/' => 'customers#out'

end

CustomersControllerの記述

class Admin::CustomersController < ApplicationController

  before_action :authenticate_admin!


  def index
    # kaminariを使用するための記述
    @customers = Customer.page(params[:page]).per(10)
  end

  def show
  end

  def edit
  end

  def update
  end

  private

  def customer_params
    params.require(:customer).permit(:last_name, :first_name, :last_name_kana, :first_name_kana, :postcode, :address, :phone_number, :email, :is_deleted)
  end

end

Customers/index.html.erbの記述

<div class=“row”>

    <h2>会員一覧</h2>

    <table class='table'>

      <thead>
        <tr>
          <th>会員ID</th>
          <th>氏名</th>
          <th>メールアドレス</th>
          <th>ステータス</th>
        </tr>
      </thead>

      <tbody>
        <% @customers.each do |customer| %>
          <tr>
            <td><%= customer.id %></td>
            <td style>
              <!--フルネームにするための記述-->
              <%= link_to customer.first_name, admin_customers_path(customer.id) %>
              <%= link_to customer.last_name, admin_customers_path(customer.id) %>
            </td>
            <td><%= customer.email %></td>
            <td><%= if customer.deleted_at == nil %>
                有効
                <% else %>
                無効
                <% end %>
            </td>
          </tr>
        <% end %>
        <!--kaminariを使用するための記述-->
        <%= paginate @customers %>
      </tbody>
    </table>

</div>

結局自力で解決できず…

ルーティングの中身を確認したり、rails routesでパスを調べたり、コントローラーを見てみたり自分でググってみたりなどしましたが、解決できませんでした。
どなたかわかる方いらっしゃいましたらご教授お願いいたします。

0

2Answer

Routes が

  namespace :admin do
    ...
    resources :customers, only: [:index, :show, :edit, :update]

なのでパスは /admin/customers です。 admins ではありません。

1Like

Comments

  1. 返信ありがとうございます!パスの方変更したら次はSyntaxErrorが...
    SyntaxError in Admin::CustomersController#index
    Extracted source (around line #26):
    24
    25
    26 <td><%= if customer.is_deleted == false %>
    有効
    <% else %>
    無効
          </td>

    とのエラー表示が出てきました。表示の通り<%= if customer.is_deleted == false %>の記述の仕方がおかしいのでしょうか。
  2. if の前の <%= を <% に直してください。

    <%= ... %> タグは、 ... 部分のコードを評価した値をその場に埋め込みます。
    <%= customer.email %> はメールアドレスを埋め込むし、 <%= 1 + 2 %> は3を埋め込むわけですね。

    一方で if customer.is_deleted == false は if 文の一部分でしかなく、これだけでは値を返すコードになりません。なので <%= ... %> タグの中には書けません。
  3. 分かりやすいif falseの説明ありがとうございます!この%=部分に関してそのような違いがあることを全く知りませんでした。コードで使われる記号の使い方をもっと深く調べてみます!

追加の質問についてです。

全ては@uasiさんの仰る通りなので
蛇足的な補足を3点いたします。

◇補足(1)
まず、erbの記法についての参考を紹介しておきます。(古い記事なのは申し訳ないです)
Railsのerbで使われる記号の意味

◇補足(2)
既知でしたら申し訳ありませんが
エラーとして

SyntaxError ~

は読んで時の如く
Rubyの文法エラー(構文エラー)なので
タイポや記述が間違っていないかチェックしてみましょう

また、

(around line #~)

は「その行」とは限らず「周辺の行」に
問題がある可能性もありますので
もし次にエラーに遭遇した時は確認してみましょう。

◇補足(3)
更に追加で申し上げると

<td style>

のように
スタイル指定をしていないにも関わらずとりあえず記述してある、というような
意図が分からない記述は削除(ないし修正)することをオススメします。
(可読性が高くなればその分、コードを読む未来の自分も、第三者も幸せになります)
本来であれば直接スタイル指定すること自体も避けるべきですが…

長文失礼いたしました。

1Like

Comments

  1. 返信ありがとうございます。正直プログラミングを始めたばかりで知識が浅く、style指定に関してもよくわかっておりません。張っていただいたリンクの方拝見させていただきました。今回答えていただいたことを意識して記述していきます!

Your answer might help someone💌