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

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

ただいまの
回答率

89.08%

railsで def createができません

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 651

rails1

score 18

 前提・実現したいこと

入力したモデルを保存したいです
cocoonを使っています。

 エラー・困っていること

保存したいのですが、def createを通過してしまいます。
また、 binding.pryも入れていたのですが、def createに行ってくれないため止まってくれません。

 ソースコード

コントローラー

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

    def index
    end

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

    def create
        if @article.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 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

モデル

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

ビュー

        <form>
            <h2アイテムを追加する</h2>
            <%= form_for(@article) do |f| %>
                <%= f.fields_for :items do |i| %>
                <div class="item">
                    <%= i.hidden_field :article_id, value: @article.id %>
                    <div class="field">
                        <label>アイテム名</label>
                        <%= i.text_field :name %>
                    </div>
                    <div class="field file-field">
                        <label>画像</label>
                        <%= i.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 %>     
        </form>


Articleコントローラー

class ArticlesController < ApplicationController
    include SetupOgbImage

    before_action :set_article, only:[:show, :edit, :update, :destroy]
    before_action :correct_user, only: [:edit]

    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 show
        @item = @article.items.all
    end

    def edit
    end

    def update
    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
        @article = current_user.articles.find_by(id: params[:id])
        redirect_to root_url if @article.nil?
    end 
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • GoToWorks

    2018/10/27 19:56

    articleのコントローラーってどうなっていますか?

    キャンセル

  • rails1

    2018/10/27 20:49

    articleコントローラーを追記させていただきました。

    キャンセル

回答 2

checkベストアンサー

0

maisumakunさんもおっしゃっている通り、外側のformは余計ですので外してください。

あと気になったのはform_for(@article)だと、@articleが保存済みの場合は自動的にupdate用のフォームになってしまいます。
厳密にフォーム先を定義したいなら、Rails5ではform_withで定義することをお勧めします。
https://qiita.com/hmmrjn/items/24f3b8eade206ace17e2

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/29 12:47

    > dialbirdさま

    ありがとうございます。おっしゃる通り、updateに飛んでいたのですが、update actionが記載がなかったため動いていないということが分かりました。

    キャンセル

0

1つ考えられることとして、<form>が2重になっていることがあります(form_for<form>を生成します)。外側の<form></form>を消してみたらどうなりますでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/29 12:46

    > maisumakunさま

    ご回答いただきましてありがとうございます。
    いただいたようにformを一つに統一してみました。
    解決したみたいです。

    キャンセル

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

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

関連した質問

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