🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Ruby on Rails

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

Q&A

解決済

2回答

1440閲覧

updateアクション内での、現在表示しているパスによる条件分岐が、current_page?()を利用してもできない

TakahiroShoji

総合スコア7

Ruby

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Ruby on Rails

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

0グッド

0クリップ

投稿2019/12/14 14:41

前提・実現したいこと

ruby on railsでYahoo!知恵袋のようなシステムを作っています。
記事検索機能を実装中に以下のエラーが発生しました。

原因と解決策をご教示お願いいたします。

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

・ edit_post_path(@post.id)にてPost全体(:solvedを除く)をupdateアクションで定義 ・ post_path(@post.id)にてPost[:solved]のみupdateアクションで定義 しており、current_page?()のヘルパーメソッドを用いて、 表示しているパスでupdateアクション内を条件分岐しようと試みたが、条件分岐の指定がうまくいかず、else以降の処理のみ実行される。 正しい現在ビューを表示しているパスの指定がしたい

該当のソースコード

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), method: :patch, class: :form__btn__solved -# post[:solved]をfalseからtrueへ変えるリンクです

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]) if current_page?(post_path(@post.id)) @post.update_solved_true redirect_to post_path(@post.id) else post = Post.find(params[:id]) post.update(post_params) redirect_to post_path(post.id) end 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

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メソッドを使用しています。

また、以下サイトを参考にUrlHelpercontroller 2行目に利用しましたが、うまく実装できませんでした。
[Rails] Controllerで表示してるページのパスを判定したい

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

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

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

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

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

guest

回答2

0

ちょっと混乱しています(私が)
current_page? ってViewのhelperだったと思うのです。
controllerでviewのhelperが使えないことはないですが、controllerではまだどのviewに(pageに)遷移するかは決まっていない(決めるのがcontroller)ので current_page? ってどのページについて結果を返すのだろうか???

updateを呼ぶviewの方でcurrent_page?で判定してその結果を渡すか
current_page?ではなくリクエストheaderを解析して判断するか

ではないでしょうか

投稿2019/12/14 21:31

winterboum

総合スコア23567

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

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

TakahiroShoji

2019/12/15 09:31

いつもご回答ありがとうございます。 current_page?で実装することは一旦諦め、posts/solved_controller.rbという別のコントローラーを作成し、その中にupdateアクションを定義しました。そして、link_toに任意のコントローラーのアクション名を指定することで実装できるのではと考えました。 こちらにて改めてご質問させていただきましたので、ご回答いただけますと幸いです。 https://teratail.com/questions/229646?modal=q-comp
guest

0

自己解決

投稿2019/12/18 06:24

TakahiroShoji

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問