よろしくお願いします。
自作のウェブアプリケーションを作っているのですが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アクション)にリダイレクトされる
の流れで新しい牛の登録をするつもりで上のコントローラを書いたのですが、
フォームの内容が書かれた状態のままで、URLだけが変更されてしまっています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/22 05:41
2019/11/22 06:14
2019/11/22 06:26 編集
2019/11/22 12:52
2019/11/22 21:49
2019/11/23 13:00
2019/11/23 21:22
2019/11/24 12:59
2019/11/24 13:08
2019/11/24 13:09
2019/11/25 03:46
2019/11/26 23:33
2019/11/26 23:49