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

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

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

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2323閲覧

link_toに追加したパラメータをビューからコントローラに渡せない

ayumu0622

総合スコア23

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/01/29 12:27

編集2020/02/11 12:01

よろしくお願いします。

Rails初学者です。
自作のアプリを作っており、ビューに記述したlink_toメソッドに追加したパラメータをコントローラに渡したいのですがうまくいきません。

酪農をやっていて、自作の牛群管理アプリを作っています。
イメージ説明

イメージ説明

搾乳牛管理画面は実際の牛舎内の配置と同じになっています。
セル内の数字は牛の個体識別番号を示し、クリックすると牛の詳細情報を閲覧できるようになっています。

このアプリで、牛の配置を変更する機能を作ろうとしています。

①ある牛(とりあえずここではAとします)の詳細画面の「移動」ボタンで移動のためのアクションへレンダリング

②牛の移動のページで搾乳牛管理画面で表示されている画面と同様のものを表示し、Aの牛を移動させたい場所をクリックする。

③搾乳牛管理画面へレンダリングされ、Aの牛は移動先に選んだ場所へ移動し、元々Aの牛が登録されていた場所には「新規作成」のリンクが作られる。

という流れで機能を作りたいと考えています。

牛の移動画面(moveアクション)
イメージ説明

「牛を配置場所」を管理するテーブルと「牛の個体情報」を管理するテーブルは1対1の関連付けをしています。
牛の移動画面のlink_toメソッドにそれぞれの配置場所のパラメータを追加して、移動させたい場所をクリックすると牛の個体情報に関連付けられている配置場所のパラメータが「現在登録されている配置場所」から「移動させたい場所(link_toに追加されているパラメータ)」に書き換わるようにすればいいのかな、と思い機能を作ってみているのですが、link_toに追加したパラメータをコントローラに渡せないので配置場所の書き換えがうまくできません。
どのようにすればいいのか教えていただきたいです。

cows_controller.rb

ruby

1class CowsController < ApplicationController 2 3 def show 4 5 @cow = Cow.find(params[:id]) 6 end 7 8 def new 9 @cow = Cow.new(birthday: Date.new(2010,1,1),stall_id: params[:stall_id]) 10 end 11 12 def edit 13 @cow = Cow.find(params[:id]) 14 end 15 16 def cow_params 17 params.require(:cow).permit(:number, :name, :birthday, :status, :stall_id) 18 end 19 20 def create 21 @cow = Cow.new(cow_params) 22 23 if @cow.save 24 redirect_to @cow, notice: "登録しました。" 25 else 26 render "new" 27 end 28 end 29 30 def update 31 @cow = Cow.find(params[:id]) 32 @cow.assign_attributes(params[:cow]) 33 if @cow.save 34 redirect_to @cow, notice: "更新しました" 35 else 36 render "edit" 37 end 38 end 39 40 def destroy 41 @cow = Cow.find(params[:id]) 42 @cow.destroy 43 redirect_to :stalls, notice: "削除しました。" 44 end 45 46 47 def move 48 49 @cow = Cow.find(params[:id]) 50 51 @account = current_account 52 53 @stall = @account.stalls.includes(:cow).order("stallnumber") 54 55 end 56 57 def moved 58 59 byebug 60 61 @cow = Cow.find(params[:id]) 62 63 @account = current_account 64 65 @cow.stall_id = params[:stallnumber] 66 67 @cow.save 68 69 redirect_to :stalls, notice: "変更しました。" 70 end 71 72end 73

牛の配置場所 マイグレーションスクリプト

ruby

1class CreateStalls < ActiveRecord::Migration[5.2] 2 def change 3 create_table :stalls do |t| 4 t.integer :stallnumber, null: false 5 6 t.timestamps 7 end 8 end 9end 10

牛の個体情報 マイグレーションスクリプト

ruby

1class CreateCows < ActiveRecord::Migration[5.2] 2 def change 3 create_table :cows do |t| 4 t.references :stall,null: false 5 t.integer :number, null: false 6 t.string :name, null: false 7 t.date :birthday, null: false 8 t.integer :status,null: false, default: 1 9 10 11 12 t.timestamps 13 end 14 end 15end 16

move.html.erb

html

1<% @page_title = "牛の移動" %> 2<h1><%= @page_title %></h1> 3 4 5 6 <% @half = current_account.all_stalls/2 %> 7 <table class = "index" align = "left"> 8 9 10 11 <% @half.downto(1).to_a.each do |i|%> 12 <% @line = @stall.find_by stallnumber: i %> 13 <% if @line.cow.present? %> 14 <% if @line.cow.status == "乾乳牛" %> 15 <tr><td class = "dry"><%= link_to @line.cow.number, moved_cow_path(@line.cow),method: :patch,stallnumber: @line.stallnumber %></td></tr> 16 <% else %> 17 <tr><td><%= link_to @line.cow.number, moved_cow_path(@line.cow),method: :patch, stallnumber: @line.stallnumber %></td></tr> 18 <% end %> 19 <% else %> 20 <tr><td><%= link_to "新規作成" , moved_cow_path(@line),method: :patch,stallnumber: @line.stallnumber%></td></tr> 21 <% end %> 22 <% end %> 23 24 </table> 25 26 27 <table class = "index" align = "left"> 28 <% current_account.all_stalls.downto(@half + 1).to_a.each do |i|%> 29 <% @line = @stall.find_by stallnumber: i %> 30 31 32 33 <% if @line.cow.present? %> 34 <% if @line.cow.status == "乾乳牛" %> 35 <tr><td class = "dry"><%= link_to @line.cow.number, moved_cow_path(@line.cow),method: :patch,stallnumber: @line.stallnumber %></td></tr> 36 <% else %> 37 <tr><td><%= link_to @line.cow.number, moved_cow_path(@line.cow),method: :patch ,stallnumber: @line.stallnumber%></td></tr> 38 <% end %> 39 <% else %> 40 <tr><td><%=link_to "新規作成" , moved_cow_path(@line),method: :patch,stallnumber: @line.stallnumber %></td></tr> 41 <% end %> 42 <% end %> 43 44 45 46 </table> 47 48

routes.rb

ruby

1Rails.application.routes.draw do 2 root "top#index" 3 4 resources :stalls 5 resources :cows do 6 resources :treatments 7 get "move" , as: "move", on: :member 8 patch "moved" , as: "moved", on: :member 9 end 10 resources :treatments 11 resource :session, only: [:create,:destroy] 12 resource :password, except: [:index] 13 resources :accounts do 14 resources :stalls 15 end 16end 17

よろしくお願いします。

2020.1.30追記

rails routesの結果(抜粋)

treatments#destroy move_cow GET /cows/:id/move(.:format) cows#move moved_cow PATCH /cows/:id/moved(.:format) cows#moved cows GET /cows(.:format) cows#index POST /cows(.:format) cows#create new_cow GET /cows/new(.:format) cows#new edit_cow GET /cows/:id/edit(.:format) cows#edit cow GET /cows/:id(.:format) cows#show PATCH /cows/:id(.:format) cows#update PUT /cows/:id(.:format) cows#update DELETE /cows/:id(.:format) cows#destroy treatments GET /treatments(.:format) treatments#index

2020.1.30 20:45追記
イメージ説明

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

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

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

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

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

no1knows

2020/02/12 00:37

質問とあまり関係がないのですが、牛の移動先は空いているところ(図でいうと新規作成)に移動させるだけという前提で良いのでしょうか?
ayumu0622

2020/02/12 06:17

no1knows様 一応牛が今いる場所にも移動できるようにするつもりでいました その場合はlink_toメソッドにdata-confirm属性をつけて元いた牛に上書きされることを確認した上で牛を移動できるように対応しようかなと考えていました
guest

回答2

0

rails routes してみてください moved_cow_path ってありますか?
view の moved_cow_path でエラーは出ない?

patch "moved" , as: "moved", on: :member 
とあるので、 moved_path(@line)ではないかと

あと
@cow = Cow.find(params[:id])
とありますが、渡ってくるのは line のid ですので、
@cow = Line.find(params[:id]).cow
では
@cow = Cow.find(params[:id]) としたいのなら
moved_path(@line.cow)

投稿2020/01/29 13:45

winterboum

総合スコア23324

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

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

ayumu0622

2020/01/30 06:14

ご回答ありがとうございます。 質問本文の方にrails routesの内容を抜粋して載せました。 moved_cow_pathは一応ありました。 viewのmoved_cow_pathの部分は特にエラーも起こらず牛の移動ができないこと以外はmovedアクションは動いています。 lineはviewの中で記述してある変数で、内容は牛の場所を管理するStallのレコードになっていますので、 @cow = Line.find(params[:id]).cowだとエラーが出てしまいます。 movedアクションで牛の配置場所を書き換える際に、書き換えられる牛のレコードも必要だと思ってupdateアクションを参考に@cow = Cow.find(params[:id])と記述したのですが必要なかったのでしょうか。 私の認識違いだったらすいません...
shinoharat

2020/01/30 06:28 編集

横から失礼します。 winterboum さんの回答にも書いてありますが、view 側を以下のように変更する必要があると思います。 moved_cow_path(@line) ↓ moved_cow_path(@line.cow) 引数には Cow のインスタンスを渡さないといけないです。 コントローラ側は @cow = Cow.find(params[:id]) のままでOKです。
winterboum

2020/01/30 07:59

ああ、確かに lineはモデルじゃないんですね。 shinoharatさんがコメントしていただけてますが、 引数には Cow のインスタンスを渡さないといけないのでmoved_cow_path(@line.cow)にしてください
ayumu0622

2020/01/30 12:06

shinoharat様、ご回答ありがとうございます。 winterboum様も引き続きご回答ありがとうございます。 ご指摘いただいた通り変更して動作を確認してみたところActionController::UrlGenerationError in Cows#moveとエラーが出ました。 エラー画面を質問本文の方に追加しました。 missing required keys: [:id]となっているのですが@lineにあったstallモデルのレコードのidが必要、ということでしょうか?
ayumu0622

2020/02/10 12:29

時間が空いてしまい申し訳ございません。 前回のコメントに書いたエラーはmove.html.erbの新規作成ボタンでのパスをmoved_cow_path(@line.cow)からmoved_cow_path(@line)から変更することで解決しました。 エラーは解消されましたが依然として牛の移動がうまくいきません。 movedアクションでデバッグを行うと@cowに「移動させたい場所(@line.cow)」の牛のデータが入っています。「移動させたい牛」のデータがmovedアクションに渡っていない、あるいは取り出せていないのだと思うのですが「移動させたい牛」のデータの渡し方、取り出し方がわからないです。 お時間あるときで構いませんのでご助力頂きたいです。
winterboum

2020/02/10 12:48

載っているのは最終形のソースになってますか?
ayumu0622

2020/02/11 12:04

すいません、move.html.erbを今現在のものに修正しました。 moved_cow_path(@line) ↓ moved_cow_path(@line.cow) に変更しています。 新規作成の部分だけmoved_cow_path(@line)になっています。
guest

0

ベストアンサー

いろいろと修正が必要なので、やり方の一つとして下記を参考にしてください。
https://github.com/xxxxxxxxx

概要

  • 牛の登録と移動だけができるシステムとなっています。
  • テーブルは、牛の個体場所と配置場所を一つにまとめました。
  • CSSは設定してないので提示頂いたテーブルの形ではないですが、stall番号順にしました。
  • DHHさん(Railsを作った人)が書くようなシンプルなコントローラーの書き方にしました。(参考)
  • 牛が配置されているところに、移動することしかできません。(元いた牛のstall番号は変更していないので、おなじstall番号ができてしまいます。)

投稿2020/02/16 10:47

編集2020/02/19 06:36
no1knows

総合スコア3365

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

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

ayumu0622

2020/02/19 05:57

ご回答ありがとうございます。 返信が遅くなってしまい申し訳ございません。 githubを扱うのが初めてなのですが、上記のURLのページにあるコードをダウンロードしてアプリを起動してみればよいのでしょうか...
no1knows

2020/02/19 06:05

はい、そうです! Railsのバージョンがruby '2.6.3'、railsのバージョンが6.0.2.1になっているので、そこだけ利用している環境に合わせていただく形になるかと思います。
ayumu0622

2020/02/19 06:28

起動できました。 link_toを使ってやってみたいと思っていましたがno1knows様にご提示いただいたように牛の個体情報の編集画面で牛の場所(stall)を指定して牛の移動を行った方が簡潔に実装できそうな気がしてきました... 前回の質問でno1knows様にご指摘いただいていましたがきちんとレールに沿って機能を作った方がやりやすいことが回りまわって理解できました... 作っていただいたアプリを参考に機能の実装方法を見直してみたいと思います。 ありがとうございます。
no1knows

2020/02/19 06:35

あぁ、ちなみに移動時はlink_toを利用しています。 controllers/cows/moves_controllerの中にありますのでこちらを参考にしていただければと思います。 あと上記githubのリンクなどは削除させていただきますね。
ayumu0622

2020/02/19 07:05

了解いたしました。 ありがとうございました。
ayumu0622

2020/02/20 04:44

すいません、頂いたアプリのについてなんですが、move_idはどこから出てきたものなんでしょうか... 回答が終わってからまた質問するのは大変恐縮なんですがお時間あるときに教えていただきたいです...
ayumu0622

2020/02/21 06:46

すいません解決しました
no1knows

2020/02/21 06:54

一応、補足として、このMovesコントローラーですが、最初はとっつきにくいのでCows_controllerの中にまとめてしまっても良いかと思います。 勉強のためにDHHの書くようなシンプルなコントローラー(index/show/new/edit/create/update/detroyだけ)で作るかたちにしています。 MovesコントローラーはCowsコントローラーから継承しているため、Cowsコントローラーのファイルの1行目がclass Cows::MovesController < ApplicationControllerとなっているのですが... たぶんわかりやすいのでCowsコントローラーにまとめちゃってください。
ayumu0622

2020/02/22 12:13

了解です 参考にさせていただきます ありがとうございます…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問