在Rails中,如果变量设置为true,如何干净地只执行代码?

时间:2018-01-11 19:29:17

标签: ruby-on-rails

在我的布局/书籍中,我的导航代码能够满足我对书籍的所有观点。

我还有我的标题代码,这些标题会影响我对书籍的所有观点。我真的只想让我的标题代码点击索引并显示而不是我的订单。

我已尝试在我的标题周围添加如下内容:

<% if @render.header == true/false %>

然后加入我的观点:

<% @render.header = true %> 

我最终获得了未定义的方法`header&#39;。我也尝试过这样的事情:

 

我需要做些什么才能使其发挥作用?我应该把东西放进我的控制器吗?

编辑:我在布局/书籍和索引中也尝试了以下内容:

db.url=jdbc:mysql://<HOST>/<SCHEMA>?autoReconnect=true
db.user=<USER>
db.pwd=<PW>
server.port=8000

这导致未定义的meathod&#34; header =&#34;

我可以使用全局变量来实现这一点,但这必须是个坏主意。

4 个答案:

答案 0 :(得分:0)

你可以这样做:

if @render && @render.header

答案 1 :(得分:0)

因此,在我的布局/书中徘徊之后:

<% if @render.header == true/false %>

要:

<% $header == true/false %>

哪个有效,但它是全球性的。最后更新我的控制器索引和显示:

def index
@header = true
end

然后我的布局/书籍:

<% @header == true %>

所以是的。变量类型。

答案 2 :(得分:0)

这与我在评论中已经指出的情况完全不同,但在这里它是:

首先,@render在视图中默认为nil。因此,当您尝试设置标头的值时,它会失败并显示undefined method 'header=' for nil:NilClass(因为Rails会为nil:NilClass查找名为#header=的方法。

使用普通变量@render_header

您只需在控制器或视图中设置一个普通变量(例如@render_header)(在呈现标题之前):

<% @render_header = true %>

然后在标题中

<% if @render_header %>
# ...

使用@render = {header:true}

的哈希值

或者,如果您真的想使用@render变量,可以将其设置为哈希:

<% @render = { header: true } %>

然后在标题中

<% if @render.present? && @render[:header] %>
# ...

这几乎就像你最初写的那样。

根据控制器操作

自动设置变量

如果您需要为多个控制器操作设置此变量,则可以查看controller filters。它们就像回调一样工作,但对于控制器来说。

例如,你可以这样做:

class MyController < ApplicationController
  before_action :set_render_header_to_true, only: [:new, :show]

  # ...

  private

  def set_render_header_to_true
    @render_header = true
  end
end

这样,对于:new和:show动作,变量将自动设置为true。如果您有多个控制器需要将render_header设置为true,则可以将set_render_header_to_true方法移动到ApplicationController。例如,这将起作用:

class ApplicationController

  private

  def set_render_header_to_true
    @render_header = true
  end
end

class MyController < ApplicationController
  before_action :set_render_header_to_true, only: [:new, :show]
  # ...
end

class MyOtherController < ApplicationController
  before_action :set_render_header_to_true, except: :index
  # ...
end

从控制器设置自定义布局

您还可以根据控制器操作指定要呈现的特定布局:

class MyController < ApplicationController
  layout 'with_header'
  # Use the line below to render header only for specific actions,
  # such as new and edit
  # layout 'with_header', :only => [:show, :edit]

  # ...
end

您甚至可以定义一种动态选择布局的方法:

class MyController < ApplicationController
  layout :determine_layout
  def determine_layout
    if action_name == :new
      'layout1'
    elsif action_name == :show
      'layout2'
    else
      'application'
    end
  end
  # ...
end

答案 3 :(得分:0)

我认为我不了解你的问题。无论如何你也可以使用content_for。例如,如果添加到layout / books.html.erb:

<%= yield :header %>

对于带有标题的索引/ show / etc视图:

<% content_for :header do %>
  <div class="header">
    HTML
  </div>
<% end %>