2016-10-27 9 views
1

companies (id, serial...), user (id, serial, company_id...)のようなテーブルを持つRails(4.2.6)アプリケーションがあります。ここで、serialはランダムに生成された5〜20文字の長い文字列であり、テーブルごとに一意です。私は何を達成しようとしていること/companies/:serial/users/:serialのようなルートを持っていることです...Rails - 優先ルートパラメータ - GLOBALLY

私はdocumentationを読んだことがある、とroutes.rbで、次の操作を行うことができます。

resources :companies, param: :serial 
resources :users, param: :serial 

、それはあまりにも乾燥していないのです。..これをグローバルに行う方法はありますか?私はこれを1行(resources :companies, :users, param: :serial)にすることができることを知っていますが、他の名前空間にはルールを適用したい別のテーブルがあります。

私が考えていた別のものは、シリアルキーをプライマリキーとして持っていましたが、自動インクリメント整数を好んで、user.company_serialの10〜20文字の長さの値を持つカラムを使用してデータベースを浪費したくありません...

は私が私のリソースの周りparam: :serialでスコープを作成しようとしている:

path_names(マニュアルに hereを読む)しかし、それは、所望の効果を持っていなかったとのような
scope param: :serial do 
    resources :companies 
    ... 
end 

ではなく記号でparams[:param]を追加しました値私は本当に理解していない何らかの理由で。

また、メソッドto_paramの存在についても知っていますが、私がよく理解していれば、モデルで使用する必要があります。同じコードを複数のモデルと同じ数だけ書く必要があります。

+1

各テーブルに明示的に指定することは、必ずしも悪いことではありません。 DRYはRubyであまりにも遠すぎます(クリップのソースコードを読んでください)。私は、明示的にそれを定義している各テーブルがローカル空間のシリアルリソースであると思います。最初の2つの行を1つにまとめることは実用的だと思われます。 – Pyrce

+1

@Pyrce、そうですが、アプリケーション全体のルールを適用したいと思います。sheep1が白、sheep2が白、sheep3がwhite ...のようにSheperdが羊を列挙し始めたように感じますすべての羊は白であると言っているのではなく、400人がいる。結局のところ、それは他の方法がなければ私がやろうとしていることだよ。 – Misu

答えて

1

IDパラームparams[:id]を使用した場合と同じように、URLでシリアルを送信し、コントローラで使用します。

Company.find_by_serial(params[:id) 

ルートを変更する必要はなく、コントローラのアクションだけです。これも乾かすことができます。

明示的にシリアルを渡すか、to_paramメソッドを追加することでこれを行うことができます。 to_paramをモデルに追加すると、IDを使用して作業を保存するルートを生成するすべての場所でこれが常に使用されます。あなたがむしろid(私は管理コントローラのようないくつかのコントローラでこれを好む)を使用する場所がある場合は、明示的にそれを渡すか、それを回避する必要があります。

+0

ええ、良いもの。私はそれについても考えていましたが、ちょっとハッキーに思えただけで、Railsはそれを乾かすための「正式な」方法を持っていると感じました。 2年たってそのコードを見ると、 'find_by_serial(params [:id])'の行に混乱するかもしれません。 – Misu

+0

そうです。私はスコープメソッドでしばらく探して、それはparamオプションを取って、個々のリソース呼び出しに渡すように見えません。私はそれも期待していただろう。 – Swards