相关疑难解决方法(0)

如果内容产生,则以其他方式呈现(Rails 3)

我已经离开Rails一段时间了,所以也许我错过了一些简单的东西.

你怎么能做到这一点:

<%= yield_or :sidebar do %>
  some default content
<% end %>
Run Code Online (Sandbox Code Playgroud)

甚至:

<%= yield_or_render :sidebar, 'path/to/default/sidebar' %>
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我正在尝试:

def yield_or(content, &block)
  content_for?(content) ? yield(content) : yield
end
Run Code Online (Sandbox Code Playgroud)

但是这会引发"无阻塞"错误.

在第二种情况:

def yield_or_render(content, template)
  content_for?(content) ? yield(content) : render(template)
end
Run Code Online (Sandbox Code Playgroud)

这在没有定义内容时有效,但只要我使用content_for覆盖默认内容,它就会抛出相同的错误.

我用这个作为起点,但它似乎只有在视图中直接使用时才有效.

谢谢!

rendering views ruby-on-rails

11
推荐指数
2
解决办法
6337
查看次数

使用一块默认内容产生content_for

我们的Rails项目大量使用content_for.但是,如果没有使用任何内容定义,我们经常需要呈现默认内容content_for.为了便于阅读和维护,这个默认内容在块中是有意义的.

我们在Rails 2.3中创建了一个辅助方法,现在我们已经为Rails 3重构了这个方法(如下所示).

这些助手都工作得很好,但我想知道是否有一种更简洁的方法可以在Rails 3中实现同样的功能.

Rails 2.3:

def yield_or(name, content = nil, &block)
  ivar = "@content_for_#{name}"

  if instance_variable_defined?(ivar)
    content = instance_variable_get(ivar)
  else
    content = block_given? ? capture(&block) : content
  end

  block_given? ? concat(content) : content
end
Run Code Online (Sandbox Code Playgroud)

这对于这样的事情很有用:

<%= content_for :sidebar_content do %>
    <p>Content for the sidebar</p>
<% end %>

<%= yield_or :sidebar_content do %>
    <p>Default content to render if content_for(:sidebar_content) isn't specified</p>
<% end %>
Run Code Online (Sandbox Code Playgroud)

为Rails 3重构:

def yield_or(name, content = nil, &block)
  if content_for?(name) …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails-3

6
推荐指数
1
解决办法
1159
查看次数

应用程序布局中的Rails条件侧边栏

以下是我的应用程序布局文件

  .container_12.clearfix
  = render :partial => 'shared/flashes'

  .grid_8
    = render :partial => 'shared/search'        
    = yield
  .grid_4
    = yield(:sidebar)
Run Code Online (Sandbox Code Playgroud)

它必须是网格,一个用于内容,另一个用于侧边栏.现在我正在创建一个登录页面,其中我不想显示我的侧边栏(只是单个网格.我可以简单地创建新的布局,其中.grid_12 div作为单个网格.

但这让我有2个应用程序布局.如何使相同的应用程序布局条件化以产生侧边栏?

如果使用侧边栏,它将与上面的相同,只是一个.grid_12,如下所示

  .container_12.clearfix
  = render :partial => 'shared/flashes'      
  .grid_12
    = render :partial => 'shared/search'        
    = yield
Run Code Online (Sandbox Code Playgroud)

layout views ruby-on-rails

5
推荐指数
1
解决办法
3722
查看次数