簡體   English   中英

如何將我的link_to語法轉換為使用塊?

[英]How can I convert my link_to syntax to use a block?

我有一個當前使用link_to對象的視圖,因此使用了文檔中定義的簽名:

link_to(body, url_options = {}, html_options = {}) 

我想將其轉換為塊樣式語法,以便可以在link_to中添加多個樣式化元素。 我一直在嘗試使用文檔中提供的備用簽名:

link_to(options = {}, html_options={}) do
   #stuff
end

但這並不成功,因為它不提供url_options哈希,僅提供options 有沒有一種方法可以使options哈希值接受我當前的url_options 例如,我當前的(工作)代碼如下:

link_to ’Click Me’, { controller: :projects, action: :create, project: { modification: true } }, method: :post

並且我正在嘗試使其以以下形式(在HAML中)工作:

link_to { controller: :projects, action: :create, project: { modification: true } }, method: :post do
   .heading 'Click me'
    #add some other elements here

這給了我以下錯誤:

syntax error, unexpected ':', expecting '}' 

或者,我是否忽略了在link_to中實現塊的另一種方法? 我是Rails和程序設計的新手,因此將不勝感激,包括有關如何以更有用的方式提出此問題的建議。

實際上,即使有一個塊,link_to簽名也確實提供了一個url_options arg。 這是rails源代碼中的簽名:

link_to(name = nil, options = nil, html_options = nil, &block)

實際上,選項和url選項是同一回事。 這是link_to方法內部發生的情況:

url = url_for(options)

因此,如果您為url_for傳遞的選項起作用,那么您仍然應該能夠傳遞它們以及阻止它們。

這里的關鍵之處在於,帶塊的方法和不帶塊的方法不是兩個不同的重載方法,如果您選擇不提供arg,則它與具有默認args的方法相同。

看來Rails與參數混淆了。 我懷疑嵌套的{}會把它扔掉。

一種解決方案是添加() ,以弄清楚哪個參數是哪個。

link_to ({ controller: :projects, action: :create, project: { modification: true } }, method: :post) do
   .heading 'Click me'

為什么不使用更簡單的路徑/ URL幫助器:

projects_path(project: { modification: true })

請記住,花括號在Ruby中具有多個目的。 一種是將哈希括起來,例如:

{a: 1, b: 2}

另一種是將塊傳遞給方法,例如:

[1, 2].map { |i| i * 2 }

對於以下代碼:

= link_to { controller: :projects, action: :create, project: { modification: true } }, method: :post do
  .heading 'Click me'

當您實際上想創建一個Hash時,Ruby會在您嘗試將一個塊傳遞給link_to時解釋第一個打開的花括號。

通過為link_to添加括號來解決此問題,以便Ruby已經將第一個花括號作為參數的一部分:

= link_to({controller: :projects, action: :create, project: {modification: true}}, method: :post) do
  .heading 'Click me'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM