【问题标题】:Why do we need to render variable with @ in front of variable name , in the rails 5 controller, to access the variable in the view为什么我们需要在变量名前用@渲染变量,在rails 5控制器中,以访问视图中的变量
【发布时间】:2017-06-21 19:19:55
【问题描述】:

我正在尝试将 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})%>

【问题讨论】:

  • 您不必总是这样做。事实上,测试人员可能不赞成在视图中使用实例变量!当然,当使用render 时,您可以通过当地人,不是吗?有关详细信息,请参阅Passing Local Variables。另外,这种设计不应该是在视图中操纵 json 响应而不是尝试访问 @inquiry 对象吗?

标签: ruby-on-rails reactjs jsx


【解决方案1】:

如果你这样做:

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

然后通过这种方式创建inquiry 作为局部变量。除了创建它们的范围之外,不能从任何其他地方访问局部变量。这样,该变量就不会从 show 方法中“退出”。

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

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

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

Rails 会尝试在它所在的当前“位置”,即视图中查找该变量,如果视图中没有定义任何 bla 变量,则会引发此类错误。

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

我可以引用一个旧答案:

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

【讨论】:

  • 我不明白这是如何回答这个问题的。看到更多细节会很棒。
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多