[英]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.