2015-06-16 37 views
0

查看application.html.erb包含以下內容如何在控制器中設置標題?

<title><%= content_for?(:title) ? yield(:title) : t(:stocktaking_title) %></title> 

如何傳遞數據從控制器的方法對此有何看法? 我的意思是使用符號:title。我不太瞭解Ruby。

class WelcomeController < ApplicationController 
    def download 
    view_context.content_for(:title, "My Awesome Title") # doesn't work :( 
    end 
end 

的Rails 4.1.9,紅寶石2.0.0(2014年5月8日)[universal.x86_64-darwin14]

回答

2

的prependeded @字符到一個變量是變量什麼暴露到視圖範圍。在你的控制器:

def show 
    @title = "My Title" 
end 

會讓任何渲染的模板文件訪問它使用:

<%= @title %> 

顯然,你正在尋找某種標題的處理邏輯。也許你可以嘗試的東西,如替換你application.html.erb文件中的代碼:

<% if @title %> 
    <title><%= @title %></title> 
<% elsif content_for?(:title) %> 
    <title><%= yield(:title) %></title> 
<% else %> 
    <title><%= t(:stocktaking_title) %></title> 
<% end %> 

你可以濃縮到這一點三元,但認爲不會很可讀。

如果你堅持使用content_for控制器裏面,你可以使用view_context方法,但你似乎不能直接像這樣用content_for工作:

view_context.content_for(:title, "My Awesome Title") 

相反,你需要實施您自己的content_for方法以擴展view_context。我pulled it from this Gist,但這裏的代碼:

class ApplicationController < ActionController::Base 
    ... 
    # FORCE to implement content_for in controller 
    def view_context 
    super.tap do |view| 
     (@_content_for || {}).each do |name,content| 
     view.content_for name, content 
     end 
    end 
    end 
    def content_for(name, content) # no blocks allowed yet 
    @_content_for ||= {} 
    if @_content_for[name].respond_to?(:<<) 
     @_content_for[name] << content 
    else 
     @_content_for[name] = content 
    end 
    end 
    def content_for?(name) 
    @_content_for[name].present? 
    end 
end 

這已經過測試和工作。

然後只需在您的控制器中執行content_for :title, "My Awesome Title"

儘管如此,使用@title將會更方便,更簡單「hacky」。你甚至可以做這樣的事情:

<title><%= @title || content_for(:title) || t(:stocktaking_title) %></title> 
+0

我只想使用符號':title',我不想改變一切。 – zoonman

+0

@zoonman然後嘗試我的編輯。 – sjagr

+0

不適用於我的情況。我更新了問題,它有適當的格式。 – zoonman

相關問題