質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

1対多でsubcategoryからcategoryのidが取得できない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 714

ma5toy

score 15

 前提・実現したいこと

前回、js周りでつまづきましたが、jqueryを入れることで解決しました。
ただ、今回はrails周りでエラー発生しつまづいております。
最終的には前回と変わらず、連動した動きのセレクトボックスを作ろうとしています。
sub_categoryからcategoryのidを取り出そうとしている部分でつまづいています。
どなたかご教授ください。

 発生している問題・エラーメッセージ

undefined method `sub_categories' for #<Category::ActiveRecord_Relation:0x00007fcad95ff798>

 該当のソースコード

class Users::SubCategoriesController < ApplicationController

  def index
    @sub_category = SubCategory.new
    @sub_categories = SubCategory.all
    category = Category.where(params[:id])
    render json: category.sub_categories.select(:id, :sub_category_name)
  end
class SubCategory < ApplicationRecord
  validates :sub_category_name, presence: true
  belongs_to :category
  has_many :articles

end
    = form_for [:users, @article] do |f|
      .form-item
        - category_options = Category.order(:id).map { |c| [c.category_name, c.id, data: { children_path: users_category_sub_categories_path(c) }] }
        = f.select :category_id, category_options, { include_blank: true }, class: 'select-parent'

        - sub_categories = @article.category.try(:sub_categories) || []
        - sub_category_options = sub_categories.map { |c| [c.sub_category_name, c.id] }
        = f.select :sub_category_id, sub_category_options, { include_blank: true }, class: 'select-children'
      .form-item
        = f.label :tag_name, "Tag :"
        = f.collection_check_boxes(:tag_ids, Tag.all, :id, :tag_name)
      .form-item
        = f.label :article_title, "Title :"
        = f.text_field :article_title, required: true
      .form-item
        = f.text_area :article_content, class: 'tinymce', rows: 20, cols: 120
        = tinymce
      .form-item
        = f.collection_check_boxes(:tag_ids, Tag.all, :id, :tag_name)
      .button-panel
        = f.submit "Posting", class: "button"
      .form-footer
        = link_to '一覧へ戻る', users_articles_path
$(() =>
  (function() {
    const replaceSelectOptions = function($select, results) {
      $select.html($('<option>'));
      return $.each(results, function() {
        const option = $('<option>').val(this.id).text(this.name);
        return $select.append(option);
      });
    };

    const replaceChildrenOptions = function() {
      const { childrenPath } = $(this).find('option:selected').data();
      const $selectChildren = $(this).closest('form').find('.select-children');
      if (childrenPath != null) {
        return $.ajax({
          url: childrenPath,
          dataType: "json",
          success(results) {
            return replaceSelectOptions($selectChildren, results);
          },
          error(XMLHttpRequest, textStatus, errorThrown) {
            console.error("Error occurred in replaceChildrenOptions");
            console.log(`XMLHttpRequest: ${XMLHttpRequest.status}`);
            console.log(`textStatus: ${textStatus}`);
            return console.log(`errorThrown: ${errorThrown}`);
          }
        });
      } else {
        return replaceSelectOptions($selectChildren, []);
      }
    };

    return $('.select-parent').on({
      'change': replaceChildrenOptions});
  })()
);
  namespace :users do
    resources :articles
    resources :categories do
      resources :sub_categories, shallow: true
    end
    resources :tags
  end

 試したこと

https://qiita.com/jnchito/items/59a5f6bea3d7be84b839
こちらを参考にして作成しています。
やりたいことは、まさにそのままです。
サイトでは、

category = Category.find(params[:id])


ですが、この時点でIDがないというエラーになります。
違うサイトでwhereならということでしたが、結局はidを取得出来ていないため
categoryのidを取得出来ないと次でエラーになってしまいました。
どなたかご教授いただければと思います。
よろしくお願いいたします。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
vagrant
ubuntu
ruby 2.5.2p104 (2018-10-18 revision 65133) [x86_64-linux]
Rails 5.2.1
mysql

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/10/24 19:48

    全く同じタイトルでは要件が伝わりません(あと解決した感じがない、丸投げしている)ので、少し工夫していただければと https://teratail.com/questions/153814

    キャンセル

  • ma5toy

    2018/10/24 20:08

    申し訳ございません!すぐ修正します!

    キャンセル

回答 1

checkベストアンサー

0

見当違いかもしれませんが、routeが
category_sub_categories GET    /categories/:category_id/sub_categories(.:format)                                        sub_categories#index
だったので、
category = Category.find(params[:category_id])
かなとか思いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 19:29

    凡ミスでした…泣
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る