Skip to content

Commit 006ae32

Browse files
committed
Add page finder to pages controller
Use the page finder service object to find the page per urlname or try to find a page with wildcard_url. The params will be extended by the page finder service, if a wildcard url is used.
1 parent 73f8a2a commit 006ae32

2 files changed

Lines changed: 124 additions & 4 deletions

File tree

app/controllers/alchemy/pages_controller.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,7 @@ def load_index_page
126126
def load_page
127127
page_not_found! unless Current.language
128128

129-
@page ||= Current.language.pages.contentpages.find_by(
130-
urlname: params[:urlname],
131-
language_code: params[:locale] || Current.language.code
132-
)
129+
@page ||= PageFinder.new(params: params).call(params[:urlname])
133130
Current.page = @page
134131
end
135132

spec/controllers/alchemy/pages_controller_spec.rb

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,5 +257,128 @@ module Alchemy
257257
end
258258
end
259259
end
260+
261+
describe "Wildcard URL matching" do
262+
before do
263+
PageDefinition.reset!
264+
end
265+
266+
context "with a child page that has wildcard_url (replaces slug)" do
267+
let!(:products_page) do
268+
create(
269+
:alchemy_page,
270+
:public,
271+
name: "Products",
272+
page_layout: "standard",
273+
parent: default_language_root,
274+
language: default_language
275+
)
276+
end
277+
278+
let!(:product_detail_page) do
279+
create(
280+
:alchemy_page,
281+
:public,
282+
name: "Product Details",
283+
page_layout: "product_detail",
284+
parent: products_page,
285+
language: default_language
286+
)
287+
end
288+
289+
it "matches a dynamic path and sets params" do
290+
get :show, params: {urlname: "products/42"}
291+
expect(assigns(:page)).to eq(product_detail_page)
292+
expect(controller.params[:id]).to eq("42")
293+
end
294+
295+
it "renders 404 when constraint does not match" do
296+
expect {
297+
get :show, params: {urlname: "products/not-a-number"}
298+
}.to raise_error(ActionController::RoutingError)
299+
end
300+
end
301+
302+
context "exact page match takes priority over pattern" do
303+
let!(:products_page) do
304+
create(
305+
:alchemy_page,
306+
:public,
307+
name: "Products",
308+
page_layout: "standard",
309+
parent: default_language_root,
310+
language: default_language
311+
)
312+
end
313+
314+
let!(:product_detail_page) do
315+
create(
316+
:alchemy_page,
317+
:public,
318+
name: "Product Details",
319+
page_layout: "product_detail",
320+
parent: products_page,
321+
language: default_language
322+
)
323+
end
324+
325+
let!(:child_page) do
326+
create(
327+
:alchemy_page,
328+
:public,
329+
name: "Featured",
330+
page_layout: "standard",
331+
parent: product_detail_page,
332+
language: default_language
333+
)
334+
end
335+
336+
it "loads the exact page match, not the pattern match" do
337+
get :show, params: {urlname: child_page.urlname}
338+
expect(assigns(:page)).to eq(child_page)
339+
end
340+
end
341+
342+
context "with hierarchical patterns (grandchild under pattern page)" do
343+
let!(:products_page) do
344+
create(
345+
:alchemy_page,
346+
:public,
347+
name: "Products",
348+
page_layout: "standard",
349+
parent: default_language_root,
350+
language: default_language
351+
)
352+
end
353+
354+
let!(:product_detail_page) do
355+
create(
356+
:alchemy_page,
357+
:public,
358+
name: "Product Details",
359+
page_layout: "product_detail",
360+
parent: products_page,
361+
language: default_language
362+
)
363+
end
364+
365+
let!(:comments_page) do
366+
create(
367+
:alchemy_page,
368+
:public,
369+
name: "Comments",
370+
page_layout: "standard",
371+
parent: product_detail_page,
372+
language: default_language
373+
)
374+
end
375+
376+
it "matches a grandchild page with parent's pattern segment" do
377+
get :show, params: {urlname: "products/42/comments"}
378+
expect(assigns(:page)).to eq(comments_page)
379+
expect(controller.params[:id]).to eq("42")
380+
end
381+
end
382+
end
260383
end
261384
end

0 commit comments

Comments
 (0)