前提・実現したいこと
ruby on railsでYahoo!知恵袋のようなシステムを作っています。
解決済ステータスの更新ボタンを実装中です。
views/posts/show.html.haml
最終行のlink_to
メソッドにposts/solveds_controller.rb updateアクション
を呼び出したいのですが、posts_controller.rb updateアクション
を呼び出してしまい、エラーが発生しています。
目標としている機能として,以下2点を想定しています。
views/posts/edit.html.haml
:投稿の編集(post[:solved]を除く
)views/posts/show.html.hamlの最終行のリンク
:post[:solved]
の更新(false → true)
原因と解決策をご教示お願いいたします。
発生している問題・エラーメッセージ
terminal
1Started PATCH "/posts/10" for ::1 at 2019-12-15 18:10:39 +0900 2Processing by PostsController#update as HTML 3 Parameters: {"authenticity_token"=>"a5UbA9DF0LZRwyFdUs+EJC3c0KwupzxksSLMx706+jzlIKTTXk1abTF0oSKtOW3S2A4pTcKTEkEJFaWM29KjvA==", "id"=>"10"} 4 User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 5 Post Load (0.3ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 10 LIMIT 1 6Completed 400 Bad Request in 4ms (ActiveRecord: 0.8ms) 7 8 9ActionController::ParameterMissing (param is missing or the value is empty: post): 10 11app/controllers/posts_controller.rb:51:in `post_params' 12app/controllers/posts_controller.rb:34:in `update' 13
該当のソースコード
models/post.rb
class Post < ApplicationRecord attr_accessor :keyword has_many :comments belongs_to :user validates :solved, inclusion: {in: [true, false]} def update_solved_true self.solved = true if self.solved == false self.save end
views/posts/show.html.haml
.contents .postElement - if @post.industry? 希望業界: = @post.industry - if @post.hopejob? 希望職種: = @post.hopejob - if @post.nowjob? 現職: = @post.nowjob .content__upper__right__status - if @post.solved? .content__upper__right__status-solved 解決済 - else .content__upper__right__status-unsolved 受付中 .content__upper__right__status-date = @post.created_at.strftime("%Y/%m/%d(%a) %H:%M") .postAuthor = @post.user.name - if user_signed_in? && current_user.id == @post.user_id && @comments.empty? && !@post.solved? .postManage = link_to "編集", edit_post_path(@post.id), class: "postManage__edit" -# edit_post_pathへ遷移するリンクです = link_to "削除", post_path(@post.id), method: :delete, data: { confirm: '削除しますか?' }, class: "postManage__delete" %p.postText = @post.text .container - if @post.solved? .content__upper__right__status-solved 解決済 %br .content__upper__right__status-date = @post.updated_at.strftime("%Y/%m/%d(%a) %H:%M") - else .content__upper__right__status-unsolved 受付中 %br - if current_user.id == @post.user_id = link_to "解決済にする", post_path(@post), controller: :PostsSolveds, action: :update, method: :patch, class: :form__btn__solved -# posts/solveds_controller.rbを呼び出したいリンクです
views/posts/edit.html.haml
.contents .content__title 自己PRの編集 = form_for @post, html: {class: 'form'} do |f| = f.text_field :industry, placeholder: :希望業界, class: :form__element = f.text_field :hopejob, placeholder: :希望職種, class: :form__element = f.text_field :nowjob, placeholder: :現職, class: :form__element = f.text_area :text, placeholder: :自己PR本文, class: :form__text = f.submit '投稿する', class: :form__btn, data: { confirm: '編集完了しますか?' }
controllers/posts_controller.rb
class PostsController < ApplicationController include ActionView::Helpers::UrlHelper before_action :set_post, only: [:edit, :show] def index @post = Post.new @posts = Post.includes(:user).paginate(params).recent end def show end def edit end 〜〜 (中略) 〜〜 def update # 誤って呼び出されてしまうupdateアクションです post = Post.find(params[:id]) post.update(post_params) redirect_to post_path(post.id) end private def post_params params.require(:post).permit(:industry,:hopejob ,:nowjob, :text, :solved).merge(user_id: current_user.id) end def set_post @post = Post.find(params[:id]) end end
controllers/posts/solveds_controller.rb
class Posts::SolvedsController < ApplicationController def update # 本来呼び出したいupdateアクションです @post = Post.find(params[:id]) @post.update_solved_true redirect_to post_path(@post.id) end end
2019XXXXXXXXXX_create_posts.rb
migrationfile
1class CreatePosts < ActiveRecord::Migration[5.0] 2 def change 3 create_table :posts do |t| 4 t.string :industry 5 t.string :hopejob 6 t.string :nowjob 7 t.text :text, null: false, :limit => 16777215 8 t.references :user, foreign_key: true 9 t.boolean :solved, default: false, null: false 10 t.timestamps 11 end 12 end 13end
config/routes
Rails.application.routes.draw do devise_for :users root "posts#index" namespace :posts do resources :searches, only: :index end resources :posts do resources :comments, only: :create end end
補足情報(FW/ツールのバージョンなど)
Rails 5.0.7.2
form_forメソッドを使用しています。
また、以下サイトを参考にcontroller
指定を試みましたが、うまく実装できませんでした。
Rails:link_toでcontroller指定
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/15 10:18