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

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

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

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

Q&A

解決済

1回答

849閲覧

[Rails] モデル コントローラー テーブルを階層的に管理する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

1クリップ

投稿2019/02/26 04:17

編集2019/03/04 09:47

1 つの Rails 上にいろいろなプロジェクトが動いているのでファイルを管理しやすいように分割したいです

テーブルは project名_model名s モデルは app/models/project名/<model名>.rb コントローラーは app/models/project名/<model名>_controller.rb

のようにできれば理想なのですが
view や assets だけはディレクトリにほうりこんでも普通にみえるのに
コントローラーやモデルはディレクトリにいれるとロードパス等を設定しないとみえなくなります

置き場所をディレクトリに分ける記事はいろいろでてきますが
モデルとテーブル名を別にする方法があまりでてこなくて
set_table_name を使う生地をみかけたのですが Rails 4.2.3 では見つからないメソッドといわれてしまいます

モデルとテーブル名を別にすることは可能なのでしょうか

また一般にプロジェクトごとにファイルを管理する方法があれば教えていただけるとありがたいです

追記

試しに最近つくったプロジェクトのファイルで試してみたんですが

  • migration のテーブル名を test_ プレフィックス付きに変更
  • 各ファイルを test サブディレクトリを作って移動
  • user.rb のモデル名に Test:: を追加
  • test.rb を作って回答で教えていただいた table prefix の設定記述
  • コントローラーに User = Test::User を追加

で index はうまく表示されたのですが
new のときに form_for @user で
undefined method `test_users_path といわれてしまいます
route 一覧をみると users_path しかありません
route.rb にも何か必要だったりしますか?
サブディレクトリに分けるとヘルパーは使えないのでしょうか

追記

回答していただいたページをみて

namespace :test, path: '/' do resources :users, path: 'user' do collection do get 'download' end end end

のようにかいたところヘルパーは動き、URLもディレクトリ移動前と同じで動作しました

メモ

i18n 辞書は namespace/モデル とスラッシュで区切る

ja: activerecord: attributes: test/user: name: 名前

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

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

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

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

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

maisumakun

2019/02/26 04:34

モデルのクラス名は「モデル名」だけですか?「プロジェクト名::モデル名」と名前空間に入れていますか?
退会済みユーザー

退会済みユーザー

2019/02/26 04:44 編集

これから設計する段階でまだ決めていません その書き方もはじめてみました 今全てのファイルが app/model app/controller にばらまかれてる状態で すでに数十個ファイルがあふれてて見にくいので これから作るプロジェクトのファイルだけでも分けたいと思ってるところです
guest

回答1

0

ベストアンサー

名前空間がプロジェクト名::モデル名でいいのであれば、app/models/project_name/model.rbのように配置することができます。

なお、以下のようなファイルを置けば、ProjectName::以下のモデルに対してtable_nameの設定の必要がなくなります(ProjectName::Userproject_name_usersテーブルを見るようになります)。

# app/models/project_name.rbに設置 module ProjectName def self.table_name_prefix 'project_name_' end end

投稿2019/02/26 04:49

maisumakun

総合スコア145184

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

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

maisumakun

2019/02/26 04:50

なお、これらのモデルに対してhas_manyやbelongs_toを掛ける場合、class_nameやforeign_keyなどでの設定が必要になります。
退会済みユーザー

退会済みユーザー

2019/02/26 08:37

foreign_key の書き方で苦労しましたがなんとかサブディレクトリにおいて動くようになりました 何度も返信いただいて本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問