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

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

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

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

Q&A

解決済

1回答

155閲覧

2つのモデル間のリレーションがはれない

07290729

総合スコア15

Ruby on Rails 5

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

0グッド

0クリップ

投稿2018/02/15 08:27

編集2018/03/07 09:58

以下のようなモデル間(主:TargetServer, 副:Disk)で
リレーションを貼ってひとつのフォームで複数のモデルをDBへ登録できるようにしようとしているのですが、TargetServerをAddしようとすると

undefined method `disk' for #Targetserver:0x00007f7c25709358

と出てしまいます。。

いろいろと調べたのですがうまく解決できなかったため
どなたか対応法をご教授いただければ幸いです。
よろしくお願いいたします。

  • app/models/targetserver.rb
class Targetserver < ApplicationRecord has_many :disks accepts_nested_attributes_for :disks end
  • app/models/disk.rb
class Disk < ApplicationRecord belongs_to :targetserver end
  • app/controllers/targetservers_controller.rb
class TargetserversController < ApplicationController before_action :set_targetserver, only: [:show, :edit, :update, :destroy] # GET /targetservers # GET /targetservers.json def index @targetservers = Targetserver.all end # GET /targetservers/1 # GET /targetservers/1.json def show end # GET /targetservers/new def new @targetserver = Targetserver.new @targetserver.disks.build end # GET /targetservers/1/edit def edit end # POST /targetservers # POST /targetservers.json def create @targetserver = Targetserver.new(targetserver_params) respond_to do |format| if @targetserver.save format.html { redirect_to @targetserver, notice: 'Targetserver was successfully created.' } format.json { render :show, status: :created, location: @targetserver } else format.html { render :new } format.json { render json: @targetserver.errors, status: :unprocessable_entity } end end end # PATCH/PUT /targetservers/1 # PATCH/PUT /targetservers/1.json def update respond_to do |format| if @targetserver.update(targetserver_params) format.html { redirect_to @targetserver, notice: 'Targetserver was successfully updated.' } format.json { render :show, status: :ok, location: @targetserver } else format.html { render :edit } format.json { render json: @targetserver.errors, status: :unprocessable_entity } end end end # DELETE /targetservers/1 # DELETE /targetservers/1.json def destroy @targetserver.destroy respond_to do |format| format.html { redirect_to targetservers_url, notice: 'Targetserver was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_targetserver @targetserver = Targetserver.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def targetserver_params params.require(:targetserver).permit(:hostname, :cpumemory, :os, disks_attributes: [:disk]) end end

(TargetServerをAddする際に呼び出す_form)

<%= form_with(model: targetserver, local: true) do |form| %> <% if targetserver.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(targetserver.errors.count, "error") %> prohibited this targetserver from being saved:</h2> <ul> <% targetserver.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :hostname %> <%= form.text_field :hostname, id: :targetserver_hostname %> </div> <div class="field"> <%= form.label :cpumemory, "CPU & Memory" %> <%= form.text_field :cpumemory, id: :targetserver_cpumemory %> </div> <div class="field"> <%= form.label :os, "OS" %> <%= form.text_field :os, id: :targetserver_os %> </div> <%= @targetserver.disk.each do |disk| %> <%= hidden_field_tag :partitionname, id: :disk_partitionname, :value => "/" %> <%= disk.label :disk_size %> <%= disk.text_field :size, id: :disk_size %> <% end %> <div class="actions"> <%= form.submit %> </div> <% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

フォームのビューに

rb

1@targetserver.disk.each do |disk|

という箇所がありますが,この disk が正しくは disks と複数形なのではないでしょうか。

投稿2018/03/07 13:06

scivola

総合スコア2108

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

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

07290729

2018/03/07 16:19

scivolaさん アドバイスありがとうございます! ご指摘いただいた修正を施したところ 当該箇所はパスしたようなのですが、 以下のエラーが出てしまう状態です。。。 Diskのコントローラやモデルを さらに修正する必要があるのでしょうか。。。 立て続けの質問で大変恐縮ですが もし修正箇所わかりましたらご指摘いただけますと幸いです。。。 undefined method `label' for #<Disk:0x00007f58904d4690> Extracted source (around line #31): <%= @targetserver.disks.each do |disk| %> <%= hidden_field_tag :partitionname, id: :disk_partitionname, :value => "/" %> <%= disk.label :disk_size, "Disk Size" %> <<<<< <%= disk.text_field :size, id: :disk_size %> <% end %>
katoy

2018/03/07 17:30 編集

入れ子の form の画面をつくるには fields_forを使います。 @targetserver.disks.each do |disk| %> で disk,label や disk.text_field としたでは、エラーになります。 disk は form の要素でなく、Activerecord の要素なので label や text_filed なんてメソッドは持っていませんから。 参考情報 [Railsでaccepts_nested_attributes_forとfields_forを使ってhas_many関連の子レコードを作成/更新するフォームを作成] http://ruby-rails.hatenadiary.com/entry/20141208/1418018874#accepts_nested_attributes_for-form
07290729

2018/03/08 09:36

katoy-san -- <%= form.fields_for :disks do |disk| %> <%= hidden_field_tag :partitionname, id: :disk_partitionname, :value => "/" %> <%= disk.label :disk_size, "Disk Size" %> <%= disk.text_field :size, id: :disk_size %> <% end %> -- こちらのコードに変更したところ、 disksが無事にDBにレコードされました! ありがとうございます。 まだ実際の値が入らないので、 コントローラなどの修正が必要なようなのですが もう少し確認してみます。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問