🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1440閲覧

syy生NoMethodErrorが解決できない

yukitodesu3

総合スコア10

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/03/23 16:10

編集2021/03/24 00:55

railsでwebアプリケーションを作っています。f.hidden_fieldを使い、genreモデルのgenre_idのデータをitemモデルのgenre_idに送る機能を実装中にNoMethodErrorが出ました。エラー文の意味はわかるのですが、解決方法がわかりません。コードの確認やエラー文の確認を行ったのですが、怪しいところは見つかりませんでした。お忙しいとは思いますが、回答していただけるとありがたいです。よろしくお願いします。

仕様
・namespaceを使っており管理者とログイン者で画面を分けています。
・アソシエーションを使っており、genreモデルにitemモデルを関連付けています。
・ログイン機能にはdevisemを使っています。

イメージ説明

routes.rb

Rails.application.routes.draw do devise_for :admins devise_for :customers namespace :public do resources :homes,only:[:index] end namespace :admin do get 'sign_in' => 'sessions#new' resources :items, only: [:create, :index, :show, :edit, :update, :destroy,:new] resources :genres, only: [:index, :create,:edit, :update] root 'homes#top' end root 'public/homes#top' end

new.html.erb

<div class="container"> <div class="row"> <div class="col"> <h1>商品新規登録</h1> <%= form_for (@item_new),url: admin_items_path do |f| %> <h4>商品画像</h4> <%= f.attachment_field :image %> <h4>商品名</h4> <%= f.text_field :shop_name,:placeholder=>"商品名" %> <h4>商品説明</h4> <%= f.text_area :caption,:placeholder=>"ここに説明文を記述します。" %> <% end %> <%= form_for (@item) do |f| %> <p>ジャンル</p> <%= hidden_field_tag :genre_id,@genre.genre_id %> <% end %> <%= form_for (@item_new),url: admin_items_path do |f| %> <p>税抜価格</p> <%= f.text_field :price,:placeholder=>"1000" %>円 <div class="field"> <%= f.check_box :is_active, {multiple: true}, "black", nil %>販売中 <%= f.check_box :is_active, {multiple: true}, "white", nil %>販売停止中 </div> <%= f.submit '新規登録' %> <% end %> </div> </div> </div>

items.contller.rb

lass Admin::ItemsController < ApplicationController def new @item_new = Item.new @item = Item.all @genre = Genre.find(@item.genre_id) end def index end def create end def show end def edit end def update end private def item_params params.require(:item).permit(:shop_name, :image, :caption, :genre_id, :price, :is_active,:item_id) end end

schema.rb

# ActiveRecord::Schema.define(version: 2021_03_21_094144) do create_table "addresses", force: :cascade do |t| t.integer "address_id" t.integer "customer_id" t.string "name" t.string "postal_code" t.string "address" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "admins", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.integer "admin_id" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_admins_on_email", unique: true t.index ["reset_password_token"], name: "index_admins_on_reset_password_token", unique: true end create_table "cart_items", force: :cascade do |t| t.integer "cart_item_id" t.integer "item_id" t.integer "customer_id" t.integer "amount" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "customers", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.string "last_name" t.string "first_name" t.string "last_name_kana" t.string "postal_code" t.string "address" t.string "telephone_number" t.integer "customer_id" t.boolean "is_deleted" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_customers_on_email", unique: true t.index ["reset_password_token"], name: "index_customers_on_reset_password_token", unique: true end create_table "genres", force: :cascade do |t| t.integer "genre_id" t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "items", force: :cascade do |t| t.integer "item_id" t.integer "genre_id" t.string "name" t.string "image_id" t.text "introduction" t.integer "price" t.boolean "is_active" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "order_details", force: :cascade do |t| t.integer "order_detail_id" t.integer "order_id" t.integer "item_id" t.integer "price" t.integer "amount" t.integer "making_status" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "orders", force: :cascade do |t| t.integer "order_id" t.integer "customer_id" t.string "postal_code" t.string "address" t.string "name" t.integer "shipping_cost" t.integer "total_payment" t.integer "payment_method" t.integer "status" t.datetime "created_at", null: false t.datetime "updated_at", null: false end end

item.rb

class Item < ApplicationRecord attachment :image belongs_to :genre end

genre.rb

class Genre < ApplicationRecord has_many :items, dependent: :destroy end

試したこと
・コードの確認
・エラー文の確認

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/03/23 16:38

エラーメッセージを提示しよう
yukitodesu3

2021/03/23 16:41

エラーメッセージ載せました。 ご指摘ありがとうございます
guest

回答1

0

ベストアンサー

エラーメッセージをよく読めばきちんと書いてあります。
@item = Item.allなので @itemn は Itemのインスタンスではなく、配列の様なもの(relation)です。
Itemのインスタンスなら genre_id はありますがその集合にはありません。
** 集合をしまう変数なのですから複数形にしましょう** 人がBUGります。

@genre = Genre.find(@item.genre_id)ですが、商品新規登録でgenreを決め打ちできないと思うのです。

さらに、
viewで formが3つありますが、submitで送られるのはsubmitを囲むformの内容だけです。viewの構造を見なおしてください。
そこで行きつまったら、別の質問にしてください。タイトルと変わってしまうから

投稿2021/03/23 23:26

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問