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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

2040閲覧

ruby on rails 1対多の関連付けに関して

stwebyy

総合スコア14

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/02/25 10:26

ruby on railsを勉強し始めで理解ができない部分があるため教えていただきたく質問を致しました。

現在作成中のものが、ユーザーを登録し、そのユーザー毎に企業の情報を登録していくものになっています。
deviseを用いたため、ユーザー登録などは実装済みです。
まずは関連付けを行わず、企業情報の管理のためcompanyモデルを作成し企業情報の登録などは実装してみました。
現状は誰かが登録した企業の情報が全員に見えてしまいます。
それをあるユーザーが登録した企業の情報はそのユーザーしか参照できなくするという修正を行うべく、1対多の関係にするため、belong_toとhas_manyを記載しました。


ruby

1class CreateCompanies < ActiveRecord::Migration 2 def change 3 create_table :companies do |t| 4 t.string :nameco 5 t.text :business 6 t.text :recruit 7 t.integer :income 8 t.text :wish 9 t.integer :wishpoint 10 t.integer :employee 11 t.string :advance 12 t.text :remarks 13 t.integer :users_id 14 t.timestamps 15 end 16 add_index :companies, :users_id 17 end 18end
class Company < ActiveRecord::Base belongs_to :user, foreign_key: 'users_id' # validates presence: true # validates :nameco, :business, presence: true, length: { maximum: 30 } end
class User < ActiveRecord::Base has_many :companies , dependent: :destroy validates :name, presence: true, length: { maximum: 50 } # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable end

ここまでの流れは合っていると思うのですが、この先が全くわからなくなってしまいました。

Companiesコントローラー

class CompaniesController < ApplicationController before_action :authenticate_user! PER = 7 def new @company = Company.new end def create @company = Company.new(create_params) if @company.save redirect_to root_url end end def show @company = Company.find(params[:id]) end def index @companies = Company.page(params[:page]).per(PER) end def edit @company = Company.find(params[:id]) end def update @company = Company.find(params[:id]) if @company.update_attributes(company_params) redirect_to @company flash[:success] = "企業情報を更新しました" else render'edit' end end private def create_params params.require(:company).permit(:nameco, :business) end def company_params params.require(:company).permit(:nameco, :business) end end

このコントローラーに@user= User.find(params[:id])とつけ、newメソッドとcresteメソッドに@company=@user.companies.buildと入れ込むとIDが無い、メソッドがないというエラーが出てきてしまいます。
Ruby on Rails チュートリアルの13.1.3では、自動的にメソッドが使えるようになり、user_idは自動的に正しい値に設定されますと記載されていますが違いがよくわかりません。
SQLを覗いても、companiesテーブルにusers_idのデータが入っておらず、どこで追加すればいいのかとずっと考えています。
そもそも根本的に間違っているのか・・・。

大変長くなってしまいましたが、どなたか少しでも構いませんのでアドバイスなどいただけますでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

自分も初心者なので間違っていたら申し訳ないのですが、
params.require(:company).permit(〜)の欄に、
それぞれのアクションに送る値(:user_id)などを追記しなければならないのではないでしょうか?

投稿2018/02/25 11:08

sunegex

総合スコア49

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

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

stwebyy

2018/02/25 15:30

ありがとうございます。 回答を拝見した後に回答していただいた通り記載をしました。 しかし、そのuser_idをuserテーブルから引っ張るやり方がわからずまたストップしてしまいました。 @user=User.find(params[:id])でもエラーになるため何かがおかしいみたいですがそれもわからずです・・・。
sunegex

2018/02/25 23:10

すみません。 requireの部分はもしかしたら、関係なかったかもしれません。 [ https://www.sejuku.net/blog/26617#has_many-2 ] こちら↑の記事を読むと、どうやら foreign_key はクラス名(単数)_idのような記述の仕方みたいです。 ですので、belongs_to :user, foreign_key: 'user_id' と修正すると、認識するのではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問