2017-05-08 388 views
0

一個URL在我的鳳凰應用程序創建一個查詢字符串,我想查詢字符串添加到URL:在鳳凰

some_cool_path(@conn, :index, "view-mode": "table") 

我預計它會生成一個URL像/some_cool?view-mode=table,而是它拋出一個例外:

protocol Phoenix.Param not implemented for ["view-mode": "table"] 

我該如何解決這個問題?

+0

你能後你到哪兒去定義該路由的路由器代碼? – Dogbert

+0

@Dogbert,只是一個普通的路徑'得到「some_cooll」,控制器1,:action1' – Jodimoro

+0

您的代碼是正確的,如果你有控制器和動作的名稱權。該錯誤消息表明路由實際上在URL中具有強制參數。 'post_path(MyApp.Endpoint,:index,「view-mode」:「table」)#=>「/ posts?view-mode = table」'。你能否在生成'some_cool_path' helper的路由器中粘貼確切的行? – Dogbert

回答

2

要建立從關鍵字列表查詢字符串,你可以使用URI.encode_query/1

iex(1)> URI.encode_query("view-mode": "table") 
"view-mode=table" 

但是,這似乎並沒有在這裏是問題。如果您的路線具有一些必需的參數,則您需要在傳遞查詢關鍵字列表之前指定所有參數。

例如:

  • 如果您的路線是一樣的東西/users,你上面的代碼會工作。
  • 但如果有一個像/users/:id必需的參數,你首先需要指定關鍵字列表查詢字符串之前傳遞所需的參數(S)。因此,對於這一點,你應該叫這樣的:

    users_path(@conn, :show, @user.username, "view-mode": "table") 
    
+0

謝謝。還有一個問題:假設我有一個帶有「#」 - >'example.com/something#as_table'或者'example.com/something#as_chart'的url。我如何做一個動作中的模式匹配或在控制器中解構它?這意味着,它需要的''# – Jodimoro

+0

這就是所謂的錨或片段後,獲得的價值,它不是可在服務器端,只有客戶端。 [見這個答案](http://stackoverflow.com/questions/34687098/how-to-get-the-fragment-identifier-part-of-an-url)。 – Sheharyar