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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

3093閲覧

週ごとの社員のスケジュール表を作りたい

besuko

総合スコア16

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2016/10/14 14:43

#子モデルから、親モデルと孫モデルを取得してbuildする方法が知りたい。

各社員がログイン後、今週の予定と曜日・時間を入力→保存できるシステムを作りたいと考えています。

社員(memberモデル)を親にもつ予定(planモデル)、日時(date)があります。
※dateはplanから見たら更に子モデル

memberplandate
ididid
namemember_idmember_id
-descriptionplan_id
--day_type
--time

#質問
①現状、予定を入力するとdateモデル「member_id」だけ入力されずに保存されます。
planから親モデルであるmemberと、子モデルであるdateをbuildする方法を教えて頂けませんでしょうか。

②このモデル設計で、カレンダーに「dateの:day_typeとtime」を元に「memberのname」と「planのdescription」を該当する日時に入力させることはできますでしょうか?

##マイグレーション

ruby:20160803113715_create.member.rb

1class CreateMember < ActiveRecord::Migration 2 def change 3 create_table :Members do |t| 4 t.text :name 5 t.timestamps 6 end 7 end 8end

ruby:20160803113715_create.plan.rb

1class CreatePlan < ActiveRecord::Migration 2 def change 3 create_table :Plans do |t| 4 t.integer :member_id 5 t.text :description 6 t.timestamps 7 end 8 end 9end

ruby:20160803113715_create.date.rb

1class CreateDate < ActiveRecord::Migration 2 def change 3 create_table :Dates do |t| 4 t.integer :member_id 5 t.integer :day_type 6 t.date :time 7 t.timestamps 8 end 9 end 10end

##モデル

ruby:member.rb

1class Member < ActiveRecord::Base 2 belongs_to :company 3 has_many :dates 4 has_many :plans, through: :date 5 accepts_nested_attributes_for :plans

ruby:plan.rb

1class Plan < ActiveRecord::Base 2 belongs_to :member 3 has_many :dates, dependent: :destroy 4 accepts_nested_attributes_for :dates

ruby:date.rb

1class Date < ActiveRecord::Base 2 belongs_to :member 3 belongs_to :plan

##ルーティング

ruby:routes.rb

1Rails.application.routes.draw do 2resources :mambers do 3 resources :plans 4end

##コントローラ

ruby:plans_controller.rb

1class PlansController < ApplicationController 2 def new 3 @member = Member.find(params[:member_id]) 4 @plan = @member.plans.build 5 @plan.dates.build 6 respond_with(@plan) 7 end 8 9 def edit 10 end 11 12 def create 13 @member = Member.find(params[:member_id]) 14 @plan = @member.plans.build(plan_params) 15 @plan.member_id = @member.id 16 17 if @plan.save 18 redirect_to :root, notice: '予定を入力しました' 19 else 20 render :new 21 end 22 end 23 24private 25 def plan_params 26 params.require(:plan).permit(:description, 27 dates_attributes: [:member_id, :plan_id, :day_type, :time]) 28 end

##ビュー(入力画面のみ)

html(ruby):plans/new.html.erb

1<h1><%= @member.name %>さんの予定入力</h1> 2<%= render 'form' %>

html(ruby):plans/_form.html.erb

1<%= simple_form_for([@member, @plan]) do |f| %> 2 <div class="form-inputs"> 3 <%= f.input :description %> 4 </div> 5 6 <%= f.fields_for :dates do |f| %> 7 <%= render partial: 'dates', locals: {f: f} %> 8 <% end %> 9 10 <div class="form-actions"> 11 <%= f.button :submit %> 12 </div> 13<% end %> 14

html(ruby):_dates_html.erb

1<div class="form_time_selects"> 2 <%= f.label :day_type %></li> 3 <ul> 4 <li>毎日: <%= f.radio_button 'day_type', '0', {} %></li> 5 <li>月: <%= f.radio_button 'day_type', '1', {} %></li> 6 <li>火: <%= f.radio_button 'day_type', '2', {} %></li> 7 <li>水: <%= f.radio_button 'day_type', '3', {} %></li> 8 <li>木: <%= f.radio_button 'day_type', '4', {} %></li> 9 <li>金: <%= f.radio_button 'day_type', '5', {} %></li> 10 <li>土: <%= f.radio_button 'day_type', '6', {} %></li> 11 <li>日: <%= f.radio_button 'day_type', '7', {} %></li> 12 </ul> 13 <ol> 14 <li><%= f.time_select :time, minute_step: 10, include_blank: true %></li> 15 </ol> 16</div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

①現状、予定を入力するとdateモデル「member_id」だけ入力されずに保存されます。

(Dateモデルにmember_id属性が必要な理由がよくわかりませんでしたが。。。ショートカットですかね。)

やりかたはいくつかあると思いますが、流れに沿うと。。。

PlansController#new で

ruby

1@plan.dates.build(member_id: @member.id)

として

_dates.html.erb で member_id の hidden_field をつくってあげるといいと思います。

erb

1<%= f.input :member_id, as: :hidden %>

planから親モデルであるmemberと、子モデルであるdateをbuildする方法を教えて頂けませんでしょうか。

  • plain.build_member
  • plain.dates.build

ですか?

②このモデル設計で、カレンダーに「dateの:day_typeとtime」を元に「memberのname」と「planのdescription」を該当する日時に入力させることはできますでしょうか?

できると思います。

投稿2016/10/14 15:24

hana-da

総合スコア1728

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

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

besuko

2016/10/15 16:18

hana-da様 早々にご回答いただき有難うございます。 「PlansController#new」と「_dates.html.erb」を教えて頂きました通りに書き換えましたら解決しました! 一点、登録されている情報を編集した際、Dateの日時情報は更新としてではなく、新規の情報として追加で保存されてしまいました。 何か根本的な部分に間違っている気がしています。。 もし良ければ教えて頂けませんでしょうか。 またDateモデルにmember_id属性を作っているのは、「member.dates」等でメンバーごとの週間予定を表示させるためです。 もっと簡潔に表現する方法もあるのでしょうが。。
hana-da

2016/10/15 22:55

teratailさんは一問一答を望んでおられるようなので、コメント欄で追加の質問をするのはルール違反かなぁと思います。(まぁ話の流れが追いにくなりますしね。。) なので別途質問を立ててください。 ちなみにDateの話は「編集した」がどのような操作なのかがよくわからないのでわかりません。 member.dates を簡単に実現する方法はあります。 2つの質問は別の質問なので分けて2つ質問が立っていると非常によいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問