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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 6

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

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

2回答

1259閲覧

タグ付き投稿のパラメーターにuser_idを取り込む方法について

panulog

総合スコア0

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby

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

Ruby on Rails 6

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

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2020/09/16 02:16

前提・実現したいこと

formオブジェクトを用いてタグ付きの投稿を実装しましたが、user_idがなかったので、付け直しています。
マイグレートのし直し、アソシエーションは記述しました。

コントローラーに問題があると思うのですが、一日費やしても解決できませんでした。

検索しても試した記事しか出てこなく、解決方法が見つかりません。

エラー画面のコンソールで@user, current_userなどとしてもundefinedになってしまいます。

User.allは取得できました。

発生している問題・エラーメッセージ

NameError in PostsController#create undefined local variable or method `current_user' for #<PostTag:0x00007fc867956140> Extracted source (around line #12):

deviseを使った時に、ログイン中のユーザー情報を取得する方法
使用するコントローラ内にて、
before_action :authenticate_user!
とすると、current_userでユーザー情報を取得できます。

ログイン中のユーザーIDであれば、以下のようにすれば取得可能です。
@user = current_user.id

これが書いてある記事などを参考にしました。

該当のソースコード

ruby

1class PostsController < ApplicationController 2 3 before_action :authenticate_user!, only: [:new, :create] 4 5 def index 6 @posts = Post.all.order(created_at: :desc) 7 end 8 9 def new 10 @post = PostTag.new 11 end 12 13 def create 14 @user = current_user 15 @post = PostTag.new(post_params) 16 if @post.valid? 17 @post.save 18 return redirect_to root_path 19 else 20 render "new" 21 end 22 end 23 24 def search 25 return nil if params[:input] == "" 26 tag = Tag.where(['name LIKE ?', "%#{params[:input]}%"]) 27 render json:{ keyword: tag } 28 end 29 30 31 private 32 33 def post_params 34 @user = current_user 35 36 params.require(:post_tag).permit(:message, :name).merge(user_id: current_user) 37 end 38end

補足情報(FW/ツールのバージョンなど)

rails 6.0.0
ruby 2.6.5

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

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

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

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

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

winterboum

2020/09/16 03:25

エラーメッセージとcodeが整合しません。エラーが起きた時のcodeですか12行目は空行に見えます。
guest

回答2

0

提示していただいているコードで気になったのは下記ですが、これで期待通りの動作をするでしょうか?

ruby

1- params.require(:post_tag).permit(:message, :name).merge(user_id: current_user) 2 3+ params.require(:post_tag).permit(:message, :name).merge(user_id: current_user.id)

投稿2020/09/16 04:30

no1knows

総合スコア3365

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

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

0

自己解決

変数名やシンボルにいろいろ入れてたので、どこが問題だったのが正確には把握できなかったのですが、
おそらく、formオブジェクトにおいてattr_accessor :user_idとしてたので、Post.new(user_id: user_id)としたのが良かったのかなと思います。

また、コンソールでbinding.pryを使いながらformオブジェクトの流れを把握しつつ解決することの重要性を知りました。

コメントいただいた方、ありがとうございました。

post_tag.rb

posts_controller.rb

1class PostsController < ApplicationController 2 3 before_action :authenticate_user!, only: [:new, :create] 4 before_action :getuser 5 6 def index 7 @posts = Post.all.order(created_at: :desc) 8 end 9 10 def new 11 @post = PostTag.new 12 end 13 14 def create 15 @post = PostTag.new(post_params) 16 if @post.valid? 17 18 @post.save 19 return redirect_to root_path 20 else 21 render "new" 22 end 23 end 24 25 def search 26 return nil if params[:input] == "" 27 tag = Tag.where(['name LIKE ?', "%#{params[:input]}%"]) 28 render json:{ keyword: tag } 29 end 30 31 32 private 33 34 def post_params 35 params.require(:post_tag).permit(:message, :name).merge(user_id: @user) 36 end 37 38 def getuser 39 @user = current_user.id 40 end 41end

いろいろいじってしまったので、リファクタリングできたらしようと思います。

投稿2020/09/16 08:12

panulog

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問