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

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

詳細はこちら
Ruby

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

Ruby on Rails

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

HTML

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

Q&A

解決済

1回答

438閲覧

newアクションについて

ayumu0622

総合スコア23

Ruby

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

Ruby on Rails

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

HTML

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

0グッド

0クリップ

投稿2019/11/21 12:47

編集2019/11/25 03:44

よろしくお願いします。
自作のウェブアプリケーションを作っているのですがnewアクションを自分の考えるような設定にできません。

一覧表示(indexアクション)
イメージ説明

新規作成フォーム(newアクション)
イメージ説明

新規作成をクリック(仮に最上部646の右隣のセルの新規作成をクリックしたとする)

フォームに内容を記述、フォームを送信

646の右隣のセルに新しく作成したデータが入る

というものにしたいのですがうまくいきません。

main_cows_controller.rb

ruby

1class MainCowsController < ApplicationController 2 def index 3 @maincow = MainCow.order("number") 4 end 5 6 def show 7 @maincow = MainCow.find(params[:id]) 8 end 9 10 def new 11 @maincow = MainCow.new(birthday: Date.new(2010,1,1)) 12 end 13 14 def edit 15 @maincow = MainCow.find(params[:id]) 16 end 17 18 def create 19 @maincow = MainCow.new(params[:main_cow]) 20 if @maincow.save 21 redirect_to @maincow, notice: "登録しました。" 22 else 23 render "new" 24 end 25 end 26 27 def update 28 @maincow = MainCow.find(params[:id]) 29 @maincow.assign_attributes(params[:main_cow]) 30 if @maincow.save 31 redirect_to @maincow, notice: "更新しました" 32 else 33 render "edit" 34 end 35 end 36 37 def destroy 38 @maincow = MainCow.find(params[:id]) 39 @maincow.destroy 40 redirect_to :main_cow, notice: "削除しました。" 41 end 42 43end 44

index.html.erb

html

1<% @page_title = "搾乳牛管理" %> 2<h1><%= @page_title %></h1> 3 4 5<% if @maincow.present? %> 6 7 <table class = "index" align = "left"> 8 9 <% 20.downto(1).to_a.each do |i|%> 10 <% @cow = @maincow.find_by line: i %> 11 <% if @cow.present? %> 12 <tr><td><%= link_to @cow.number, @cow %></td></tr> 13 <% else %> 14 <tr><td><%= link_to "新規作成",new_main_cow_path %></td></tr> 15 <% end %> 16 <% end %> 17 </table> 18 19 <table class = "index" align = "left"> 20 <% 40.downto(21).to_a.each do |i|%> 21 <% @cow = @maincow.find_by line: i %> 22 <% if @cow.present? %> 23 <tr><td><%= link_to @cow.number, @cow %></td></tr> 24 <% else %> 25 <tr><td><%= link_to "新規作成",new_main_cow_path %></td></tr> 26 <% end %> 27 <% end %> 28 29 </table> 30 31<% end %>

new.html.erb

html

1<% @page_title = "新規作成" %> 2 3<h1><%= @page_title %></h1> 4 5<%= form_for @maincow do |form| %> 6 <%= render "form", form: form %> 7 <div><%= form.submit %></div> 8<% end %> 9

_form.html.erb

html

1<table class = "form"> 2 <tr> 3 <th><%= form.label :number, "個体識別番号" %></th> 4 <td><%= form.text_field :number, size: 8 %></td> 5 </tr> 6 7 <tr> 8 <th><%= form.label :name, "名号" %></th> 9 <td><%= form.text_field :name, size: 50 %></td> 10 </tr> 11 12 <tr> 13 <th><%= form.label :birthday, "生年月日", 14 for: "maincow_birthday_1i" %></th></th> 15 <td><%= form.date_select :birthday,start_year: 2010, end_year: Time.current.year, 16 use_month_numbers: true %></td> 17 </tr> 18</table>

マイグレーションスクリプト

ruby

1class CreateMainCows < ActiveRecord::Migration[5.2] 2 def change 3 create_table :main_cows do |t| 4 t.integer :number, null: false 5 t.string :name, null: false 6 t.date :birthday, null: false 7 8 t.timestamps 9 end 10 end 11end

マイグレーションスクリプトその2

ruby

1class AlterMainCows < ActiveRecord::Migration[5.2] 2 def change 3 add_column :main_cows, :line, :integer 4 end 5end 6

フォームにlineカラムを入力できるようにしておけば問題自体は解決するとは思うのですが、
新規作成をクリックしたら、クリックしたセルのlineカラムが自動で設定されて、フォームではnumberカラム、 nameカラム、birthdayカラムのみを入力するようにしたいです。
何かいい方法はないでしょうか?

2019.11.25追記

stalls_controller.rb

ruby

1class StallsController < ApplicationController 2 def index 3 @stall = Stall.includes(:cow).order("stallnumber") 4 end 5 6 def show 7 @stall = Stall.includes(:cow).find(params[:id]) 8 end 9 10 def new 11 @cow = Cow.new(birthday: Date.new(2010,1,1)) 12 render template:'cows/new' 13 end 14 15 def edit 16 @stall = Stall.includes(:cow).find(params[:id]) 17 end 18 19 def create 20 @cow = Cow.new(params[:cow]) 21 if @cow.save 22 redirect_to @cow, notice: "登録しました。" 23 render template:'cows/show' 24 else 25 render "new" 26 end 27 end 28 29 def update 30 @stall = Stall.includes(:cow).find(params[:id]) 31 @stall.assign_attributes(params[:cow]) 32 if @stall.save 33 redirect_to @stall, notice: "更新しました" 34 else 35 render "edit" 36 end 37 end 38 39 def destroy 40 @stall = Stall.find(params[:id]) 41 @stall.destroy 42 redirect_to :stall, notice: "削除しました。" 43 end 44 45end 46

cows_controller.rb

ruby

1class CowsController < ApplicationController 2 def index 3 @stall = Stall.includes(:cow).order("number") 4 end 5 6 def show 7 @cow = Cow.find(params[:id]) 8 end 9 10 def new 11 @cow = Cow.new(birthday: Date.new(2010,1,1)) 12 end 13 14 def edit 15 @cow = Cow.find(params[:id]) 16 end 17 18 def create 19 @cow = Cow.new(params[:cow]) 20 if @cow.save 21 redirect_to @cow, notice: "登録しました。" 22 else 23 render "new" 24 end 25 end 26 27 def update 28 @cow = Cow.find(params[:id]) 29 @cow.assign_attributes(params[:cow]) 30 if @cow.save 31 redirect_to @cow, notice: "更新しました" 32 else 33 render "edit" 34 end 35 end 36 37 def destroy 38 @cow = Cow.find(params[:id]) 39 @cow.destroy 40 redirect_to :cow, notice: "削除しました。" 41 end 42 43end 44

stallsのindex.html.erb

html

1<% @page_title = "搾乳牛管理" %> 2<h1><%= @page_title %></h1> 3 4 5 6 7 <table class = "index" align = "left"> 8 9 <% @stall.each do |cell|%> 10 <% if cell.cow.present? %> 11 <tr><td><%= link_to cell.cow.number, cell.cow %></td></tr> 12 <% else %> 13 <tr><td><%= link_to "新規作成",new_stall_path(stall_id: cell.id) %></td></tr> 14 <% end %> 15 <% end %> 16 17 18 </table> 19

cowのshow.html.erb

html

1<% @page_title = "詳細" %> 2 3<h1><%= @page_title %></h1> 4 5<td><%= link_to "編集", [:edit, @cow] %>/ 6 <%= link_to "削除", @stall, method: :delete %></td> 7<td><%= link_to "一覧へ戻る", :stalls%></td> 8 9<table class = "attr"> 10 <tr> 11 <th>個体識別番号</th> 12 <th>名号</th> 13 <th>生年月日</th> 14 <th>状態</th> 15 </tr> 16 <tr> 17 <td><%= @cow.number %></td> 18 <td><%= @cow.name %></td> 19 <td><%= @cow.birthday %></td> 20 <td><%= @cow.status == 1 ? "経産牛" : "未経産牛" %></td> 21 </tr> 22</table>

①stallの一覧(indexアクション)から新規作成

②stallcontrollerからcowcontrollerのnewアクションを使って新規作成のフォームを表示

③フォームに内容を書いて送信

④フォームの内容が反映された詳細ページ(showアクション)にリダイレクトされる

の流れで新しい牛の登録をするつもりで上のコントローラを書いたのですが、

②で表示される画面(フォームの内容を書いた後です)
イメージ説明

②の内容をCreate Cowボタンで送信した後の画面
イメージ説明

フォームの内容が書かれた状態のままで、URLだけが変更されてしまっています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

牛をどう同定するのか、がごちゃごちゃになっています。
migrationを見ると id, number, line がそれに当たりそうですが、内lineは画面上どこに表示されるか、で牛固有のものでは無いですからその目的には使わない方が良いです。例えば100頭になって、1画面20頭ずつ表示、なんてときに困ります。
number で管理するとすると <% @cow = @maincow.find_by line: i %>とviewの中でDBから取ってくるのではなく
controller index にて@maincow = MainCow.order("number")しているのを使います

<% 20.downto(1).to_a.each do |i|%> <% @cow = @maincow.find_by line: i %>

<% @maincow.each do |cow|%> <tr><td><%= link_to cow.number, cow %></td></tr> <% end %> <tr><td><%= link_to "新規作成",new_main_cow_path %></td>

但しこうすると 最初は1頭も居ないので、上の20行は空で最後の新規作成だけになりますが

投稿2019/11/22 00:03

winterboum

総合スコア23567

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

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

ayumu0622

2019/11/22 05:41

ご回答ありがとうございます。 ご指摘の通りに書き換えてみましたが私の考えていたようにはなりませんでした… 私の説明不足で申し訳ないのですが ①一覧の表示は質問に載せた画像のように2列×20行のような表示になる。 ②セル内のデータは番号順ではなく、任意のセルに任意のデータが入るようにしたい。 ③データが入っていないセルにはnewアクションに飛ぶリンクをつけたい。 の3つができるようにしたいです。 私は酪農をやっていて、私の牧場では質問の最初の画像のセルのよう(2×20)な並びで牛をつないでいます。 牛は番号順につないでいる訳ではなく、また牛をつないでいない箇所もあります。 実際の牧場内の配置とアプリ上の牛のデータの配置を同じようにしたいです。 また質問でご指摘いただいた牛が100頭になったときの場合についてですが、自分の牧場の配置と同じようにしたいので、40頭以上にはならないです。 あくまで最初の画像のような表示で、1ページで完結した一覧表示を作りたいと考えています。 わかりづらくてすいません… 何かいい方法がありましたらご教授頂ければ幸いです。
winterboum

2019/11/22 06:14

と言うことですと、Cowで管理するのではなく、牛舎というか20x2の小部屋を管理する方がわかりやすいですね。 あと元の図では20x2の小部屋ではなく20x1の小部屋に番号と名前の2列になっています。 MainCowという名前はちょっと、、、ですがとりあえずそれを小部屋として、40でもう変わらないのなら、db/seed にて初期登録しておきましょう。 牛の管理と部屋の管理と両方やることになるでしょうから(体重の変化とか搾乳量とか管理したくなりますよね)MainCowは 1)部屋の 番号と必要なら名前 2)そこにつなぐ牛のID を入れるようにします。 で、Cowというモデルをそこに関連つける。 そんな方向で作り変えてみてはどうでしょう。 あと、20x2で固定なら、一番最後の 新規登録 のtrは不要では?
winterboum

2019/11/22 06:26 編集

その方向だと、 indexの `@maincow = MainCow.order("number")` を `@maincow = MainCow.includes(:cow).order("number")`に変え view の indexの ``` <% 20.downto(1).to_a.each do |i|%> <% @cow = @maincow.find_by line: i %> <% if @cow.present? %> <tr><td><%= link_to @cow.number, @cow %></td></tr> <% else %> <tr><td><%= link_to "新規作成",new_main_cow_path %></td></tr> <% end %> <% end %> ``` は ``` <% @maincows.each do | cell | %> <% if cell.cow.present? %> <tr><td><%= link_to cell.cow.number, cell.cow %></td></tr> <% else %> <tr><td><%= link_to "新規作成",new_main_cow_path(maincow_id: cell,id)%></td></tr> <% end %> <% end %> ``` で、CowsControllerのnewで受けることにします。 あ、 それは新しい牛が来た時か。 MainCowsControllerのnewか、updateとかinsert_cowとかですね。
ayumu0622

2019/11/22 12:52

1、db/seedに初期登録、というのはシードデータで40頭分の適当なデータを投入してしまう、ということでしょうか? 一応最初の画像の一覧にはシードデータで下のようなデータは入っています。 MainCow.create(number: 323,name: "ヒロタ ニッコリ ホルスタイン",birthday: "2015-3-9", line: 1) MainCow.create(number: 689,name: "ヒロタ プリプリ ブリッコ",birthday: "2014-8-9", line: 2) MainCow.create(number: 2628,name: "ヒロタ ラフロイグ ラガヴーリン",birthday: "2016-6-22",line: 3) MainCow.create(number: 1486,name: "ヒロタ ブラントン フォアローゼス",birthday: "2015-7-9", line: 4) .... 2、今あるMainCowでは ①牛をつなぐ場所(winterboum様のおっしゃる部屋) ②つなぐ牛のid を管理し、 新しく作ったCowモデルで牛の個体番号、生年月日を管理するよう設定し、MainCowとCowで関連付けを行う のような解釈でよろしいでしょうか? 理解力乏しくてすいません... (補足、というわけではないのですが、当初は搾乳している牛をMainCow、まだ出産していない牛をYoungCowで分けて管理しようとしていたためMainCowという名前を付けました。)
winterboum

2019/11/22 21:49

今日明日ちょっと気ぜわしいのでとりあえず、ですが 初期登録は牛ではなくつなぐ場所です。 ついでに牛もやるのもありですが なおすならmainCowを止めてつなぎ場所らしい名前にしましょうよ 搾乳できるか否かはCowの属性でよいですね
ayumu0622

2019/11/23 13:00

とりあえず ①つなぐ場所を管理するStallscontroller,Stallmodel(牛舎で牛をつなぐ場所のことをストール、と呼ぶため)を作成 def change create_table :stalls do |t| t.integer :stallnumber, null: false t.integer :(下記の理由のためまだ未記入) t.timestamps end ②牛を管理するためのCowscontroller、Cowmodelを作成 def change create_table :cows do |t| t.integer :number, null: false t.string :name, null: false t.date :birthday, null: false t.integer :status,null: false, default: 1 t.timestamps end statusカラムで搾乳牛か若牛かの区別をする予定。 この二つを関連付けるにあたって、どちらにhas_oneを書きどちらにbelong_toを書くべきか迷ったのでとりあえずここまで書いて作業を止めてあります... 当初の予定では部屋を管理する方(現在のStall)に牛のidをいれて管理する、とのことだったのでStallmodelにbelong_to :cow、Cowmodelにhas_one :stall になるんでしょうか
winterboum

2019/11/23 21:22

自然言語感覚的では StallにCawをつなぐ(割り当てる)という感じですので、 Stall が has_one :cow かなと思いますが、 belongs_to も無いわけではない。 ただ、rails的には、 belongns_to にするとdefaultではCowが繋がっていないをvalidationエラーを起こします(空の時もあるよ、という宣言が必要) ということを考慮すると、Rails語的には 相手が必ず必要な牛の方をbelongs_to にするのかな、と思います
ayumu0622

2019/11/24 12:59

class StallsController < ApplicationController def index @stall = Stall.includes(:cow).order("stallnumber") end def show @stall = Stall.includes(:cow).find(params[:id]) end def new @cow = Cow.new(birthday: Date.new(2010,1,1)) render template:'cows/new' end def edit @stall = Stall.includes(:cow).find(params[:id]) end def create @cow = Cow.new(params[:cow]) if @cow.save redirect_to @cow, notice: "登録しました。" render template:'cows/show' else render "new" end end def update @stall = Stall.includes(:cow).find(params[:id]) @stall.assign_attributes(params[:cow]) if @stall.save redirect_to @stall, notice: "更新しました" else render "edit" end end def destroy @stall = Stall.find(params[:id]) @stall.destroy redirect_to :stall, notice: "削除しました。" end end class CowsController < ApplicationController def index @stall = Stall.includes(:cow).order("number") end def show @cow = Cow.find(params[:id]) end def new @cow = Cow.new(birthday: Date.new(2010,1,1)) end def edit @cow = Cow.find(params[:id]) end def create @cow = Cow.new(params[:cow]) if @cow.save redirect_to @cow, notice: "登録しました。" else render "new" end end def update @cow = Cow.find(params[:id]) @cow.assign_attributes(params[:cow]) if @cow.save redirect_to @cow, notice: "更新しました" else render "edit" end end def destroy @cow = Cow.find(params[:id]) @cow.destroy redirect_to :cow, notice: "削除しました。" end end 関連付けは概ねうまくいき、edit、updateはうまく動くのですがnewアクションでフォームに内容を記述した後、フォームの内容を送信してもshowアクションにリダイレクトされません...
winterboum

2019/11/24 13:08

>newアクションでフォームに内容を記述した後、フォームの内容を送信してもshowアクションにリダイレクトされません. が良くわかりません (どのコントローラの?)newアクションでnewのviewを表示し そこに入力した後フォームを(どのコントローラのどのアクションに?)送信し 成功したら(どのモデルの)showに表示させたいが、(どうなった?)
winterboum

2019/11/24 13:09

あとcodeはコメント欄だと読みにくいので、質問を編集して載せていただけますか
ayumu0622

2019/11/25 03:46

質問の内容がわかりづらくて申し訳ありませんでした。 質問本文を編集して改めて質問させていただきましたのでお時間あるときにご回答頂きたいです。
ayumu0622

2019/11/26 23:33

最初の質問から少しそれた内容になってしまったので改めて別の質問記事を立てさせていただきます。 winterboum様ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問