回答編集履歴
3
ネストしたリソースによるルーティングについて追記
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
参考サイトを追記
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
文法ミスを修正
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
# どうしてもこの形式にこだわるのであれば、以下のようにします。
|
44
44
|
|
45
|
-
resources
|
45
|
+
resources :review, except: [:create]
|
46
46
|
|
47
47
|
# パス指定が重複するので、通常のresourcesでreview POSTのパスが生成されないようにする
|
48
48
|
|