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

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

ただいまの
回答率

89.20%

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

受付中

回答 0

投稿 編集

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

rails1

score 18

 前提・実現したいこと

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

 ソースコード

ビュー

<% provide(:article, @article.name + 'のアイテム追加') %>
    <div class="main">
        <div class="form">
            <h2>アイテムを追加する</h2>
            <p class="required">※一度追加したら編集/削除はできません!</p>
            <%= form_with(model: @article, url: new_items_path) do |f| %>
                <%= f.fields_for :items do |item| %>
                <div class="item">
                    <%= item.hidden_field :article_id, value: @article.id %>
                    <div class="field">
                        <label>アイテムの名前</label>
                        <%= item.text_field :name %>
                    </div>
                    <div class="field file-field">
                        <label>アイテムの画像</label>
                        <%= item.file_field :image, :type => "file" %> 
                    </div>
                </div>
                <% end %>
                <div class="add-form">
                    <%= link_to_add_association 'もっと追加する!', f, :items, partial: 'shared/add_form' %>
                </div>
               <div class="form-btn">
                    <%= f.submit "アイテムを追加する" %>
                </div>     
            <% end %>     
        </div>
    </div>
</div>

コントローラー(Articke)

class ArticlesController < ApplicationController
    include SetupOgbImage    
    before_action :set_article, only:[:show, :edit, :update, :destroy]

    def index
    end

    def new
        if user_signed_in?
          @article = current_user.articles.build
        else
          flash[:alert] = "ログインしてください。"
          redirect_to root_path
        end
    end

    def create
        @article = current_user.articles.create(create_params)
        if @article.save
          flash[:success] = "記事が作成されました!"
          redirect_to article_path(id: @article.id)
        else
          flash[:alert] = "記事の作成に失敗しました。"
          redirect_to new_article_path
        end
    end

・・・

    def edit
    end

    def update
        @article.attributes = create_params
        if @article.save
            flash[:success] = "ランキングが作成されました!"
            redirect_to article_path(id: @article.id)
        else
            flash[:alert] = "ランキングの作成に失敗しました。"
            redirect_to new_article_path
        end
    end

    def destroy
    end

    private

    def set_article
        @article = Article.find(params[:id])
    end

    def create_params
        params.require(:artcle).permit(:name, :content, :image, :user_id, items_attributes: [:id, :name, :image, :artcle_id])
    end
end

Itemコントローラー

class ItemsController < ApplicationController
    before_action :set_item, only:[:new, :show, :edit, :update, :destroy]

    def index
    end

    def new
        if user_signed_in?
        else
            flash[:alert] = "ログインしてください。"
            redirect_to item_path(id: @item.id)
        end
    end

    def create
        if @item.save
            flash[:success] = "アイテムが追加されました!"
            redirect_to new_item_path(id: @item.article_id)
        else
            flash[:alert] = "アイテムの追加に失敗しました。"
            redirect_to new_item_path(id: @item.article_id)
        end
    end

    def update
        @article.attributes = create_params
        if @article.save
            flash[:success] = "記事が作成されました!"
            redirect_to article_path(id: @article.id)
        else
            flash[:alert] = "記事の作成に失敗しました。"
            redirect_to new_article_path
        end
    end

    def destroy
    end

    private

    def set_article
        @article = Article.find(params[:id])
    end

    def create_params
        params.require(:article).permit(:name, :content, :image, :user_id, items_attributes: [:id, :name, :image])
    end

    def correct_user
        @item = current_user.items.find_by(id: params[:id])
        redirect_to root_url if @item.nil?
    end
end

Itemモデル

class Item < ApplicationRecord
  belongs_to :article, optional: true
end

Articleモデル

class Article < ApplicationRecord
    has_many :items
end

 追記

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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