我正在尝试将 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 就是这样工作的。
我可以引用一个古老的答案:
实例变量对于对象的实例是唯一的,可以是 用于其任何方法。 局部变量仅在一个内部使用 方法。