回答編集履歴

3

ネストしたリソースによるルーティングについて追記

2016/07/08 01:17

投稿

rifuch
rifuch

スコア1901

test CHANGED
@@ -61,3 +61,127 @@
61
61
 
62
62
 
63
63
  routesの設定に関しては、[Reilsガイド](http://railsguides.jp/routing.html)に詳しく乗っていますから、こちらを参考にされると良いでしょう。
64
+
65
+
66
+
67
+ コメントでのやりとりで、ネストしたリソースでパスを生成する方法の話題で、以下の返答を頂いたので、ちょっと追記します。
68
+
69
+ > URLは/restaurant/(id)のままで当該レストランに対するReviewを投稿できるようにしたい
70
+
71
+
72
+
73
+ 一つのリソース(Restaurant)にReviewを含むその他のリソースを操作するパスは、もちろん作成可能なのですが、この場合、どんどんRestaurantControllerが肥大化してゆく問題があります。
74
+
75
+ また、リソース(Model)と操作(Controller)が直結していないと、その処理がどこで行われているのかわかりにくくなる可能性もあります。
76
+
77
+ ただ、他にもいろいろな要件が絡んでくるので、どちらが正解ともいえないので、ケースバイケースで使い分ける事になるかと思います。
78
+
79
+ ```Ruby
80
+
81
+ # リソースをネストさせない場合
82
+
83
+
84
+
85
+ # routes.rb
86
+
87
+
88
+
89
+ resources :restaurant do
90
+
91
+ member do
92
+
93
+ post 'create_review'
94
+
95
+ patch 'update_review'
96
+
97
+ delete 'destroy_review'
98
+
99
+ end
100
+
101
+ end
102
+
103
+ # この状態なら、以下のパスが生成されるはず
104
+
105
+ # restaurantのCRUDは省略
106
+
107
+ # create_review_restaurant POST /restaurant/:id/create_review restaurant#create_review
108
+
109
+ # update_review_restaurant PATCH /restaurant/:id/update_review restaurant#update_review
110
+
111
+ # delete_review_restaurant DELETE /restaurant/:id/destroy_review restaurant#destroy_review
112
+
113
+
114
+
115
+ # ヘルパを使って呼び出すときはこんな感じ
116
+
117
+ <%= form_for :review, create_review_restaurant(@restaurant) do %><% end %>
118
+
119
+ <%= form_for :review, update_review_restaurant(@restaurant, review_id: @review), method: :patch do %><% end %>
120
+
121
+ <%= link_to 'delete', destroy_review_restaurant(@restaurant, review_id: @review), method: :delete do %><% end %>
122
+
123
+ ```
124
+
125
+ この場合、全てRestaurantControllerで処理するので、引き回す:idは@restaurantのものです。
126
+
127
+ update_reviewアクションとdestroy_reviewアクションでは、パスの設定には記述されていませんが、review_idをパラメータに含めて引き回す必要が出てきます。
128
+
129
+
130
+
131
+ 一方、ネストしたりソースを使う場合は以下のようになるかと思います。
132
+
133
+ ```Ruby
134
+
135
+ # リソースをネストさせる場合
136
+
137
+
138
+
139
+ # routes.rb
140
+
141
+
142
+
143
+ resources :restaurant do
144
+
145
+ resources :review, only: [:create, :update, :destroy]
146
+
147
+ end
148
+
149
+ # 生成されるパスはこんな感じ
150
+
151
+ # restaurantのCRUDは省略
152
+
153
+ # restaurant_reivew POST /restaurant/:restaurant_id/review review#create
154
+
155
+ # restaurant_review PATCH /restaurant/:restaurant_id/review/:id review#update
156
+
157
+ # restaurant_reivew DELETE /restaurant/:restaurant_id/review/:id review#destroy
158
+
159
+
160
+
161
+ # 呼び出すときはこう
162
+
163
+ <%= form_for :review, restaurant_review_path(@restaurant, @review) do %><% end %>
164
+
165
+ <%= form_for :review, restaurant_review_path(@restaurant, @review) do %><% end %>
166
+
167
+ <%= link_to 'delete', restaurant_review_path(@restaurant, @review), method: :delete %>
168
+
169
+ # もっとすっきりした書き方もありますが、わかりやすさ優先で。詳しくはRailsガイドを見てください
170
+
171
+ ```
172
+
173
+ 見比べてみるとわかるかと思いますが、ネストしたりソースとして表現した方が、すっきりしている上、責任の所在もわかりやすいかと思います。
174
+
175
+
176
+
177
+ RailsはRailに乗っている状態だとすっきりわかりやすい記述になるように出来ています。
178
+
179
+ つまり、なんだかアクロバティックな事をしている、あるいは泥臭い処理をしている状態というのは、Railから外れてきているという事になります。
180
+
181
+
182
+
183
+ 状況によっては、あえてRailから外れてやらねばならない場合も出てくるかもしれませんが、ごく一般的な処理の場合はあえてRailから外れる必要はなく、Railに乗って(Railsの推奨するやり方に従って)書き進める方が、よりわかりやすく、より書きやすい状態を維持出来ると思います。
184
+
185
+
186
+
187
+ ソースを書いていて、なんだか怪しいにおいがしてきたら、ドキュメントなどを調べてみて、本来のやり方が内かどうかをチェックすると、最終的に楽をしてきれいなソースを書けるかと思います。

2

参考サイトを追記

2016/07/08 01:17

投稿

rifuch
rifuch

スコア1901

test CHANGED
@@ -51,3 +51,13 @@
51
51
  # これで、ヘルパでreview_create_path method: :postで無事review#createが呼び出される
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ 特別な理由がない限り、デフォルトのresourcesで生成されるパスを利用される事を勧めます。
58
+
59
+ デフォルトで生成されるパスは、RESTfulなパスですから、出来るだけそれに従う方がわかりやすいと思います。
60
+
61
+
62
+
63
+ routesの設定に関しては、[Reilsガイド](http://railsguides.jp/routing.html)に詳しく乗っていますから、こちらを参考にされると良いでしょう。

1

文法ミスを修正

2016/07/06 17:09

投稿

rifuch
rifuch

スコア1901

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  # どうしてもこの形式にこだわるのであれば、以下のようにします。
44
44
 
45
- resources(:review), except: [:create]
45
+ resources :review, except: [:create]
46
46
 
47
47
  # パス指定が重複するので、通常のresourcesでreview POSTのパスが生成されないようにする
48
48