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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

641閲覧

rails post_paramsに関するエラー

yupapapa

総合スコア24

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/10/21 14:22

編集2019/10/22 04:43

railsでコンテンツ投稿機能を作成しており、画像投稿にcarrierwaveを使用しているのですが、一つ問題が発生してしまいました。
それは、投稿する際に、createアクションで、[The action 'create' could not be found for PostsController]
というエラーが発生してしまいます。
というものの、原因はわかっていて、

def create post = Post.new( post_params, user_id: @current_user.id ) post.save redirect_to("/") end

おそらく、user_idをpost_paramsの引数として設定していないからなのではと思っています(定かではない)

private def post_params params.require(:post).permit(:content, :image) end

user_idには@current_user.idを設定したいのですが、その場合のpost_paramsの処理をどうすれば良いかがわからず、困っています。ご教授願います。

post.rb

1class Post < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 validates :content, {presence: true, length: {maximum: 140}} 4 validates :user_id, {presence: true} 5 6 def user 7 return User.find_by(id: self.user_id) 8 end 9 10end

route.rb

1Rails.application.routes.draw do 2 get "login" => "users#login_form" 3 post "login" => "users#login" 4 post "logout" => "users#logout" 5 6 post "users/:id/update" => "users#update" 7 get "users/:id/edit" => "users#edit" 8 post "users/create" => "users#create" 9 get "signup" => "users#new" 10 get 'users/index' => "users#index" 11 get "users/:id" => "users#show" 12 13 get "/" => "posts#index" 14 get "posts/new" => "posts#new" 15 post "posts/create" => "posts#create" 16 get "posts/:id" => "posts#show" 17 post "posts/:id/destroy" => "posts#destroy" 18 19end

new.html.erb

1<% @post = Post.new unless @post %> 2 3<div class="main posts-new"> 4 <div class="container"> 5 <h1 class="form-heading">投稿する</h1> 6 7 <div class="box2"> 8 <p>投稿本文の内容は、140文字までです。<br>本文が空の状態での投稿はできません。</p> 9</div> 10 11<%= form_for @post,:url => {:action => :create} do |f| %> 12<div class="form"> 13 <div class="form-body"> 14 <p>募集内容(最大140文字)</p> 15<%= f.text_area :content, class: "js-text" %> 16<p class="js-text-count"></p> 17 18<%= f.file_field :image %> 19<%= f.submit "投稿する" %> 20</div> 21 </div> 22<% end %> 23</div> 24</div>
class PostsController < ApplicationController before_action :authenticate_user bedore_action :ensure_correct_user, only: [:edit, :update, :destroy] def index @posts = Post.all.order(created_at: :desc) end def show @post = Post.find_by(id: params[:id]) @user = @post.user end def new @post = Post.new end def create post = Post.new( post_params, user_id: @current_user.id ) post.save redirect_to("/") end def destroy @post = Post.find_by(id: params[:id]) @post.destroy flash[:notice] = "削除...しちゃったよ" redirect_to("/") end def ensure_correct_user @post = Post.find_by(id: params[:id]) if @post.user_id != @current_user.id flash[:notice] = "権限がありません" redirect_to("/") end end private def post_params params.require(:post).permit(:content, :image) end end

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

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

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

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

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

8zca

2019/10/21 16:54

The action 'create' could not be found for PostsController なので PostsController に createメソッドが定義されてないと思われるのですが、 貼っていただいているcreateはPostsControllerのものでしょうか? PostsController全体を記載していただいたほうがよいかと思います。
guest

回答2

0

自己解決

解決致しました。
解決方法としては、開発の段階段階でファイルを複製してバックアップをしていたので、ユーザーの紐付け処理を一から作成しました。
その際に、テストとして作成していたユーザーや投稿のレコードを全削除し、winterboumさんが訂正してくださった
post = Post.new(
post_params.merge( user_id: @current_user.id )
)
この部分をしっかりと訂正し進めたところ、エラーが発生することなく紐付け処理を作成することができました。
解凍してくださったお二方には大変感謝します。

投稿2019/10/22 06:10

yupapapa

総合スコア24

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

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

0

createを呼ぶ(htmlの)methodとroute.rbの定義が違っているのでは、と思います。片方が POSTを片方がGETを指定してしまっているのでは、と

createを呼ぶ(おそらく new.html.*)の内容とroutes.rbの内容を見せて下さい。

投稿2019/10/21 21:11

winterboum

総合スコア23329

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

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

yupapapa

2019/10/22 02:22

修正いたしました。
winterboum

2019/10/22 02:29

はて、合ってるみたいですね [The action 'create' could not be found for PostsController] が発生するfileと行はどこでしょうか
yupapapa

2019/10/22 02:33

localhost上ではエラーメッセージしか表示されていなくて、ターミナル上には、 AbstractController::ActionNotFound (The action 'create' could not be found for PostsController): actionpack (6.0.0) lib/abstract_controller/base.rb:131:in `process' actionview (6.0.0) lib/action_view/rendering.rb:39:in `process' actionpack (6.0.0) lib/action_controller/metal.rb:191:in `dispatch' actionpack (6.0.0) lib/action_controller/metal.rb:252:in `dispatch' actionpack (6.0.0) lib/action_dispatch/routing/route_set.rb:51:in `dispatch' actionpack (6.0.0) lib/action_dispatch/routing/route_set.rb:33:in `serve' actionpack (6.0.0) lib/action_dispatch/journey/router.rb:49:in `block in serve' actionpack (6.0.0) lib/action_dispatch/journey/router.rb:32:in `each' actionpack (6.0.0) lib/action_dispatch/journey/router.rb:32:in `serve' actionpack (6.0.0) lib/action_dispatch/routing/route_set.rb:837:in `call' rack (2.0.7) lib/rack/tempfile_reaper.rb:15:in `call' rack (2.0.7) lib/rack/etag.rb:25:in `call' rack (2.0.7) lib/rack/conditional_get.rb:38:in `call' rack (2.0.7) lib/rack/head.rb:12:in `call' actionpack (6.0.0) lib/action_dispatch/http/content_security_policy.rb:18:in `call' rack (2.0.7) lib/rack/session/abstract/id.rb:232:in `context' rack (2.0.7) lib/rack/session/abstract/id.rb:226:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/cookies.rb:648:in `call' activerecord (6.0.0) lib/active_record/migration.rb:567:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call' activesupport (6.0.0) lib/active_support/callbacks.rb:101:in `run_callbacks' actionpack (6.0.0) lib/action_dispatch/middleware/callbacks.rb:26:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/executor.rb:14:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call' web-console (4.0.1) lib/web_console/middleware.rb:132:in `call_app' web-console (4.0.1) lib/web_console/middleware.rb:28:in `block in call' web-console (4.0.1) lib/web_console/middleware.rb:17:in `catch' web-console (4.0.1) lib/web_console/middleware.rb:17:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call' railties (6.0.0) lib/rails/rack/logger.rb:38:in `call_app' railties (6.0.0) lib/rails/rack/logger.rb:26:in `block in call' activesupport (6.0.0) lib/active_support/tagged_logging.rb:80:in `block in tagged' activesupport (6.0.0) lib/active_support/tagged_logging.rb:28:in `tagged' activesupport (6.0.0) lib/active_support/tagged_logging.rb:80:in `tagged' railties (6.0.0) lib/rails/rack/logger.rb:26:in `call' sprockets-rails (3.2.1) lib/sprockets/rails/quiet_assets.rb:13:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/remote_ip.rb:81:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/request_id.rb:27:in `call' rack (2.0.7) lib/rack/method_override.rb:22:in `call' rack (2.0.7) lib/rack/runtime.rb:22:in `call' activesupport (6.0.0) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/executor.rb:14:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/static.rb:126:in `call' rack (2.0.7) lib/rack/sendfile.rb:111:in `call' actionpack (6.0.0) lib/action_dispatch/middleware/host_authorization.rb:83:in `call' webpacker (4.0.7) lib/webpacker/dev_server_proxy.rb:29:in `perform_request' rack-proxy (0.6.5) lib/rack/proxy.rb:57:in `call' railties (6.0.0) lib/rails/engine.rb:526:in `call' puma (3.12.1) lib/puma/configuration.rb:227:in `call' puma (3.12.1) lib/puma/server.rb:660:in `handle_request' puma (3.12.1) lib/puma/server.rb:474:in `process_client' puma (3.12.1) lib/puma/server.rb:334:in `block in run' puma (3.12.1) lib/puma/thread_pool.rb:135:in `block in spawn_thread' このようなメッセージが表示されています。
winterboum

2019/10/22 04:07

どのタイミングでこのエラーが発生しますか? newを表示した時なのか "投稿する" をclickした時なのか
yupapapa

2019/10/22 04:09

投稿するをクリックした際です。
winterboum

2019/10/22 04:20

ここかなぁ form_for @post,:url => {:action => :create} do |f| を form_for @post do |f| にしてみて下さい それでも駄目な場合はさらに routes.rbの get "/" => "posts#index" 以外の posts の定義をコメントアウトして resources :posts にしてみて下さい
yupapapa

2019/10/22 04:28

改善されませんでした。 resources :posts にして投稿したところ、/posts/create とならず、 /posts のみだったのですが、createが機能していないのでしょうか
winterboum

2019/10/22 04:36

rails が標準で提供しているインターフェースを使うと、一つのURL /posts のmethod GET、POST、PUT、PATCH、DELETEなどに応じて show , create,  update,destroyなどのアクションが割り当てられます。 >改善されませんでした。 というのは、何も変わらなかった? とすると。。。 8zcaさんの言われるように、PostsControllerが疑われます。 codeを見せていただけますか? 質問エリアに<code>で追記して下さい
yupapapa

2019/10/22 04:43

追記致しました。
winterboum

2019/10/22 04:51

実は密かに  ミススペルとか、全角空白が入っちゃってる とか を予想していたのですが、ないですね。 ごめんなさい、お手上げです。 なお、 post = Post.new( post_params, user_id: @current_user.id ) create問題が通ってもここはエラーになります。多分。 post = Post.new( post_params.merge( user_id: @current_user.id ) ) にしてください。 @current_user の @ が気になりますが。
8zca

2019/10/22 05:26 編集

コントローラーはcreateちゃんとありますね。。 bedore_action は before_action、 authenticate_user はdeviseを利用されているなら authenticate_user! とは思いますが、出ているエラーとは別ですしね。 とはいえ、 上記のままですと投稿フォームすら表示されないので、もしコピペミスでなくそのままのソースが書かれているのでしたら、記載していただいたPostsControllerと実際に動いているPostsControllerは別物だったりするのではという予想をしてみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問