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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

1595閲覧

link_toメソッド viewでの任意のcontrollerの呼び出しについて

TakahiroShoji

総合スコア7

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/12/15 09:27

前提・実現したいこと

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指定

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

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

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

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

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

guest

回答2

0

ベストアンサー

= link_to "解決済にする", post_path(@post), ですから PostsControllerにいってしまいます。
ink_to "解決済にする", controller: :PostsSolveds, action: :update
で試してください。

投稿2019/12/15 09:38

winterboum

総合スコア23284

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

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

TakahiroShoji

2019/12/15 10:18

いつもご回答ありがとうございます。 以下のようにrails routesから 該当のPrefixを指定したところ上手く実装できました。 # before = link_to "解決済にする", post_path(@post), controller: :PostsSolveds, action: :update # after = link_to "解決済にする", post_solved_path(@post), controller: :PostsSolveds, action: :update
guest

0

投稿2019/12/15 10:20

TakahiroShoji

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問