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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

0回答

1689閲覧

rails:cocoonを使って新規フォームを登録できません

rails1

総合スコア18

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2018/10/29 04:09

編集2018/10/29 04:12

前提・実現したいこと

cocoonで新規フォームを出したいです。
現状はページに飛ぶと更新フォームになってしまっています。
したがって、以前作り直したものを修正できるようになっているのですが、そうではなく、ただ新規の追加だけができるようにしたいと考えています。

エラー

undefined local variable or method `new_items_path'

form_with のドキュメントをみながら、updateではなく新しいアイテムだけを新規追加してくれるようにルーティングを設定してみたのですがエラーが出てしまっている状態です。
URL:https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_with

ソースコード

ビュー

Ruby

1<% provide(:article, @article.name + 'のアイテム追加') %> 2 <div class="main"> 3 <div class="form"> 4 <h2>アイテムを追加する</h2> 5 <p class="required">※一度追加したら編集/削除はできません!</p> 6 <%= form_with(model: @article, url: new_items_path) do |f| %> 7 <%= f.fields_for :items do |item| %> 8 <div class="item"> 9 <%= item.hidden_field :article_id, value: @article.id %> 10 <div class="field"> 11 <label>アイテムの名前</label> 12 <%= item.text_field :name %> 13 </div> 14 <div class="field file-field"> 15 <label>アイテムの画像</label> 16 <%= item.file_field :image, :type => "file" %> 17 </div> 18 </div> 19 <% end %> 20 <div class="add-form"> 21 <%= link_to_add_association 'もっと追加する!', f, :items, partial: 'shared/add_form' %> 22 </div> 23 <div class="form-btn"> 24 <%= f.submit "アイテムを追加する" %> 25 </div> 26 <% end %> 27 </div> 28 </div> 29</div>

コントローラー(Articke)

Ruby

1class ArticlesController < ApplicationController 2 include SetupOgbImage 3 before_action :set_article, only:[:show, :edit, :update, :destroy] 4 5 def index 6 end 7 8 def new 9 if user_signed_in? 10 @article = current_user.articles.build 11 else 12 flash[:alert] = "ログインしてください。" 13 redirect_to root_path 14 end 15 end 16 17 def create 18 @article = current_user.articles.create(create_params) 19 if @article.save 20 flash[:success] = "記事が作成されました!" 21 redirect_to article_path(id: @article.id) 22 else 23 flash[:alert] = "記事の作成に失敗しました。" 24 redirect_to new_article_path 25 end 26 end 27 28・・・ 29 30 def edit 31 end 32 33 def update 34 @article.attributes = create_params 35 if @article.save 36 flash[:success] = "ランキングが作成されました!" 37 redirect_to article_path(id: @article.id) 38 else 39 flash[:alert] = "ランキングの作成に失敗しました。" 40 redirect_to new_article_path 41 end 42 end 43 44 def destroy 45 end 46 47 private 48 49 def set_article 50 @article = Article.find(params[:id]) 51 end 52 53 def create_params 54 params.require(:artcle).permit(:name, :content, :image, :user_id, items_attributes: [:id, :name, :image, :artcle_id]) 55 end 56end

Itemコントローラー

Ruby

1class ItemsController < ApplicationController 2 before_action :set_item, only:[:new, :show, :edit, :update, :destroy] 3 4 def index 5 end 6 7 def new 8 if user_signed_in? 9 else 10 flash[:alert] = "ログインしてください。" 11 redirect_to item_path(id: @item.id) 12 end 13 end 14 15 def create 16 if @item.save 17 flash[:success] = "アイテムが追加されました!" 18 redirect_to new_item_path(id: @item.article_id) 19 else 20 flash[:alert] = "アイテムの追加に失敗しました。" 21 redirect_to new_item_path(id: @item.article_id) 22 end 23 end 24 25 def update 26 @article.attributes = create_params 27 if @article.save 28 flash[:success] = "記事が作成されました!" 29 redirect_to article_path(id: @article.id) 30 else 31 flash[:alert] = "記事の作成に失敗しました。" 32 redirect_to new_article_path 33 end 34 end 35 36 def destroy 37 end 38 39 private 40 41 def set_article 42 @article = Article.find(params[:id]) 43 end 44 45 def create_params 46 params.require(:article).permit(:name, :content, :image, :user_id, items_attributes: [:id, :name, :image]) 47 end 48 49 def correct_user 50 @item = current_user.items.find_by(id: params[:id]) 51 redirect_to root_url if @item.nil? 52 end 53end

Itemモデル

Ruby

1class Item < ApplicationRecord 2 belongs_to :article, optional: true 3end

Articleモデル

class Article < ApplicationRecord has_many :items end

追記

Ruby

1・・・ 2 <%= form_with(model: @article) do |f| %> 3 <%= f.fields_for :items do |item| %> 4 <div class="item"> 5 <%= item.hidden_field :article_id, value: @article.id %> 6・・・

下記のように、 model のみを指定した場合、更新画面になってしまい、すでに登録しているアイテムが入力画面に表示されてしまいます。常に追加の画面として表示するように設定したいと考えています。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問