将局部变量从控制器传递到视图

Posted

技术标签:

【中文标题】将局部变量从控制器传递到视图【英文标题】:Passing local variables to a view from controller 【发布时间】:2014-09-08 18:14:24 【问题描述】:

由于某种原因,我无法将局部变量传递给显示视图...

在我的控制器中,我只是:

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" 

没有运气...

有什么线索吗?

谢谢!

【问题讨论】:

为什么需要传递局部变量而不是实例变量?我假设“某些文本”是一个占位符,否则在视图中显示它会更有意义。我将局部变量传递给局部变量,但将实例变量传递给基本视图。 Locals 暗示它只在本地需要,之后可以清理。否则这是我的 2 秒 Googling your question 不,比这更复杂! “一些文本”只是为了说明......我正在传递不同的对象,具体取决于我调用模板的位置。为此,我别无选择,只能添加为视图定义局部变量的能力... 例如,我从控制器或装饰器调用模板。这个模板也用于不同的类,因为它们在很多方面都非常相似...... 那么我建议不要问这样一个广泛的问题,并指定总体问题是什么,这样人们可以帮助解决这个问题并提供设计建议。如果我必须共享视图方面,我通常会将它们撕成部分并传递一个更通用命名的对象来处理相似之处,但这只是我。真的,我会发布实际问题,人们会更愿意提供帮助 【参考方案1】:

将数据从控制器传递到视图

这是一个 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#index 完成运行时它们已经在NovelController 对象上定义了。 可以调用实例变量@title的实例方法。

【讨论】:

【参考方案2】:

我觉得应该是这样的

render 'books/show', :locals =&gt; :resource =&gt; 'Some text'

对我有用

【讨论】:

【参考方案3】:

TL;博士

render locals: resource: "Some text"

完整

首先我想知道你为什么需要template:。你在 Rails 2.x 上吗?如果不是,则不再需要 :template 选项。你应该可以相处得很好

render "books/show"

其次是否需要指定模板?你想渲染的控制器是什么?如果是BooksController,那么你也不需要模板路径,这使得该行只是

render

这还没有变量。现在,我刚刚查了一下,很简单:

render locals: resource: "Some text"

还有:

render 'books/show', locals: resource: "Some text"

对我来说很好用。也许早期的 Rails 版本将“资源”视为某种关键字?不知道,但以上两种形式的 Worksforme™。

【讨论】:

【参考方案4】:

您不能将局部变量从控制器传递到视图。你可以做的是将它定义为一个实例变量,然后它会自动在视图中可用。

@resource = @book

如果您想传递完全不同的对象,那么只需以不同的方式定义这些实例变量。

【讨论】:

实际上,您当然可以将局部变量从控制器传递到视图。定义实例变量是一种常见但不是唯一的方法。 @silverdr 我很想看到这个演示。 当然。一个可行的例子在我的回答deeeeeep 下面:-) 补充一点——即使是所谓的“Rails 最佳实践”也抱怨在视图中使用实例变量而不是局部变量。我实际上并不同意这一点,并认为实例变量在视图中具有有效的位置,但如果有人想遵守他们的建议,当然可以传递局部变量。【参考方案5】:

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

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

【讨论】:

以上是关于将局部变量从控制器传递到视图的主要内容,如果未能解决你的问题,请参考以下文章

将局部变量从一个函数传递到另一个函数

Express+jade:局部变量在视图中不可用

在java中,将局部变量作为参数传递到另一个类的方法里,在此方法里改变参数值,局部变量会改变吗

将任意数据从局部视图传递到布局视图

将数据从局部视图传递到父视图

将局部变量传递给嵌套的局部变量