为什么我们需要在 rails 5 控制器中的变量名称前面使用 @ 渲染变量以访问视图中的变量



我正在尝试将 JSON 响应传递给我的 React 组件的 props,但我不想在服务器中渲染它。 我感到困惑的是,当我渲染前面有@的变量时,我可以在视图中访问它,但如果没有其他方式,它就不起作用。

有效的代码

控制器

class InquiryController < ApplicationController
def show
id = params[:id]
url = 'http://127.0.0.1:3001/api/v1/inquiry/' + id 
uri = URI(url)
@inquiry = Net::HTTP.get(uri)
return :json => @inquiry
end
end

视图

<%= react_component('ShowInquiryRootComponent', {inquiry: @inquiry})%>

不起作用的代码

控制器

class InquiryController < ApplicationController
def show
id = params[:id]
url = 'http://127.0.0.1:3001/api/v1/inquiry/' + id 
uri = URI(url)
inquiry = Net::HTTP.get(uri)
return :json => inquiry
end
end

视图

<%= react_component('ShowInquiryRootComponent', {inquiry: inquiry})%>

如果你这样做:

def show
...
inquiry = Net::HTTP.get(uri)
return :json => inquiry
end

然后,通过这种方式,您将inquiry创建为局部变量。局部变量不能从创建它们的作用域以外的任何其他位置访问。这样,该变量就不会从 show 方法中"消失"。

您可以实现的方法,将变量从控制器传递到视图,就像您想在InquiryController中执行的那样,将其创建为实例变量,您调用变量的变量前面有一个@(at)。这样,该变量可以从控制器的方法发送到相应的视图。

例如,如果在控制器中的方法中创建一个名为bla的局部变量,然后想要在任何视图中访问此变量,则会看到如下错误:

NameError Exception: undefined local variable or method `bla' for #...

Rails 将尝试在当前"位置"中找到该变量,即视图,如果在视图中没有定义任何bla变量,那么它将引发此类错误。

将变量作为变量@实例从控制器传递到视图是处理它的方法,Rails 就是这样工作的。

我可以引用一个古老的答案:

实例

变量对于对象的实例是唯一的,可以是 用于其任何方法。 局部变量仅在一个内部使用 方法。

最新更新