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

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

ただいまの
回答率

87.80%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,352

score 14

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

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


class CreateCompanies < ActiveRecord::Migration
  def change
    create_table :companies do |t|
      t.string :nameco
      t.text :business
      t.text :recruit
      t.integer :income
      t.text :wish
      t.integer :wishpoint
      t.integer :employee
      t.string :advance
      t.text :remarks
      t.integer :users_id
      t.timestamps
    end
    add_index :companies, :users_id
  end
end
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のデータが入っておらず、どこで追加すればいいのかとずっと考えています。
そもそも根本的に間違っているのか・・・。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/26 00:30

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

    キャンセル

  • 2018/02/26 08:10

    すみません。
    requireの部分はもしかしたら、関係なかったかもしれません。

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

    キャンセル

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

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る