将局部变量传递给控制器​​的视图

时间:2014-09-08 18:14:25

标签: ruby ruby-on-rails-3 ruby-on-rails-4 view controller

我无法将某些原因传递给show view ...

在我的控制器中我简单地说:

def show
  render template: "books/show", :resource => "Some text"
end

在我看来,我打印以下内容:

<h1>My local variable text: <%= resource %></h1>

我收到以下消息:

undefined local variable or method `resource' for #<#<Class:0x00000118ebce90>:0x00000118ec3498>

我在控制器中尝试了以下语法:

render template: "books/show", locals: { resource: "Some text" }
render template: "books/show", locals: { resource => "Some text" }
render template: "books/show", :locals => { resource: "Some text" }
render template: "books/show", :locals => { resource => "Some text" }

没有运气......

任何线索?

谢谢!

5 个答案:

答案 0 :(得分:7)

我认为它应该像

render 'books/show', :locals => {:resource => 'Some text'}

它对我有用

答案 1 :(得分:6)

将数据从Controller传递到视图

这是一个NovelController类,将放入app/ controllers/novel_controller.rb.

class NovelController < ApplicationController
      def index
        @title = 'Shattered View: A Novel on Rails'
      end
end

由于这是Novel控制器和索引操作,因此相应的视图位于app/views/novel/index.html.erb

<h1><%= @title %></h1>

<强>输出:

Shattered View: A Novel on Rails

NovelController#index运行后解释视图。以下是视图可以访问和不能访问的内容:

  • 它可以访问实例变量@title,因为它们已经NovelController对象在NovelController#index完成运行时定义。
  • 它可以调用实例变量@title的实例方法。

答案 2 :(得分:4)

您无法将本地变量从控制器传递到视图。您可以做的是将其定义为实例变量,然后它将自动在视图中可用。

@resource = @book

如果要传递完全不同的对象,则只需以不同方式定义这些实例变量即可。

答案 3 :(得分:4)

首先,我想知道你为什么需要System.Reactive.Concurrency.IScheduler。你是Rails 2.x吗?如果不是,则不再需要template:选项。你应该能够与

相处得很好

:template

第二,你需要指定模板吗?你想要渲染的控制器是什么?如果那是render "books/show",那么您也不需要模板路径,这使得该行只是

BooksController

没有变量的那个。现在,我刚刚检查了一下,简单:

render

以及:

render locals: { resource: "Some text" }

对我来说很好。也许早期的Rails版本处理过资源&#39;作为某种关键词?不知道,但两种形式的上述Worksforme™。

答案 4 :(得分:2)

您可以按如下方式获取。所有都给出了相同的结果。这是reference链接。

render action: :show , locals: { resource: "Some text"}
render :show , locals: { resource: "Some text"}
render locals: { resource: "Some text"}