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

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

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

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

Ruby

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

Q&A

解決済

2回答

610閲覧

railsで def createができません

rails1

総合スコア18

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2018/10/27 09:03

編集2018/10/27 11:49

前提・実現したいこと

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

エラー・困っていること

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

ソースコード

コントローラー

Ruby

1class ItemsController < ApplicationController 2 before_action :set_article, 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 article_path(id: @article.id) 12 end 13 end 14 15 def create 16 if @article.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 destroy 26 end 27 28 private 29 30 def set_article 31 @article = Article.find(params[:id]) 32 end 33 34 def create_params 35 params.require(:article).permit(:name, :content, :image, :user_id, items_attributes: [:id, :name, :image]) 36 end 37 38 def correct_user 39 @item = current_user.items.find_by(id: params[:id]) 40 redirect_to root_url if @item.nil? 41 end 42end

モデル

Ruby

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

ビュー

<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コントローラー

Ruby

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

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

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

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

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

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

GoToWorks

2018/10/27 10:56

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

2018/10/27 11:49

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

回答2

0

ベストアンサー

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

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

投稿2018/10/27 22:58

dialbird

総合スコア379

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

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

rails1

2018/10/29 03:47

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

0

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

投稿2018/10/27 22:32

maisumakun

総合スコア145183

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

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

rails1

2018/10/29 03:46

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問