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

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

ただいまの
回答率

90.51%

  • Ruby

    7700questions

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

  • Ruby on Rails

    7297questions

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

Railsを使ったブログ開発で、カテゴリー機能を実装したい

受付中

回答 1

投稿 編集

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

RyotaNakamura

score 20

質問

Railsを使って基本的なブログ機能を実装しているのですが、カテゴリー機能がうまくいきません。
カテゴリーをつけてブログ記事を新規作成しようとするとエラーが出てDBへ保存されないという状態なのですが、エラーの原因がわからないので、助けていただけないでしょうか。

実装内容は以下の通りです。

モデル
1つの記事に対して、複数あるカテゴリーのうちの1つを付与したいので、以下2つのモデルを用意しています。

class Article < ApplicationRecord
 #コメント機能をつけています。こちらはうまくいっていますが、何か影響を与えている可能性も考えて、一応記載しておきます。
  has_many :comments, dependent: :destroy

  belongs_to :blog_category
class BlogCategory < ApplicationRecord
  has_many :articles
end

ビュー
付与するカテゴリーはすでに作成済みで、app/view/articles/newに以下を実装

<h1>New Post</h1>
<%= provide :button_text, "投稿" %>

<%= form_for @article do |f| %>
  <%= f.label :category_id, "カテゴリ" %>
  <%= f.collection_select :category_id, BlogCategory.all, :id, :name %>
  <%= link_to "カテゴリを追加する", new_blog_category_path %>
  <%= f.label :title %>
  <%= f.text_field :title %>
  .
  .
  .
  <%= f.submit %>  
<% end %>

コントローラー

def create
    @article = Article.new(article_params)
    if @article.save
      flash[:success] = "Successfully created..."
      redirect_to @article
    end
  end

private
def article_params
      params.require(:article).permit(:category_id, :tag_list, :title, :content)
    end

エラー
サーバーのログで、以下のようなエラーが出ます。エラーというか、DBに保存できませんでしたという内容だと思うのですが、この原因がわからず困っています。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"trT175kWavDp5FOmuYJQQ9Q03WCLGRzkZjPoaH/kNPUeAzX8GTg8wIRzx1J651XO62cLoGJwl2WdteSeCJhq5w==", "article"=>{"category_id"=>"2", "tag_list"=>"apple, orange", "title"=>"hogehoge", "content"=>"fooooo"}, "commit"=>"投稿"}
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
No template found for ArticlesController#create, rendering head :no_content
Completed 204 No Content in 86ms (ActiveRecord: 0.2ms)

試したこと

カテゴリー機能を追加したところ、保存ができなくなりました。そこで、Articleモデルのbelongs_toとビューのカテゴリーセレクトを外してみるとうまく保存できたので、アソシエーションのところで何か足りていないor間違っているのでしょうか。

色々と調べて試してみたのですが、解決できずこちらで質問させていただきました。
ご回答をお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • RyotaNakamura

    2017/09/06 23:06

    create.htm.erbを作成するとNo template foundというエラーは無くなりましたが、rollback transactionは相変わらずで、DBへの登録はできませんでした。少し勘的なところもありますが、子モデルの方からレコードを登録しようとしているあたりが怪しいかなと思っています。その辺りを試してみようと思います。

    キャンセル

  • NobutakaKomaki

    2017/09/07 11:11

    rails のバージョンは何でしょうか? rails 5であれば、belongs_to :blog_category, required: falseなどとしてみてください。

    キャンセル

  • RyotaNakamura

    2017/09/09 12:37

    2日空いてしまい申し訳在りません。required: falseにすることで保存することができました!このオプションがわからなかったので調べると、外部キーのnilを許容するオプションということですね。ここで何が起こっているのか完全にわかっていないので、これからその辺りも勉強します。ひとまず機能としては問題解決できて本当に助かりました。ありがとうございます!

    キャンセル

回答 1

0

Articleモデルなのに
コントローラで
@blog = Blog.new(blog_params)
で、Blogモデルになっているのは何故でしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/05 18:38

    Blogはこちらの記載ミスでしたので、訂正しました。開発の便宜上、記事モデルをBlogとしていたのですが、こちらで質問する際、内容のわかりやすさからBlogをArticleに書き換えて質問しました。その際の書き換え漏れです。ややこしくしてしまいすいません。

    キャンセル

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

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

関連した質問

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

  • Ruby

    7700questions

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

  • Ruby on Rails

    7297questions

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