【问题标题】:An instance variable defined in New method not accessible in Create method在 New 方法中定义的实例变量在 Create 方法中不可访问
【发布时间】:2014-09-23 22:53:49
【问题描述】:

我已经尝试并试图在其他地方找到答案,但我就是无法解决这个问题。

我有一个名为 BidSignal 的模型,它与一个名为 BuySignal 的模型相关。一个 BuySignal 有多个 BidSignal,一个 BidSignal 属于一个 BuySignal。

当我使用 BidSignal 控制器中的新方法创建新的 BidSignal 时,我想捕获与其相关的 BuySignal,因此我可以将关系保存在 BidSignal 创建方法中。我目前通过在调用新方法时将 buysignal_id 传递给 BidSignal 控制器来执行此操作。但是当我来创建 BidSignal 记录并尝试调用 buysignal_id 以查找 BuySignal 记录时,我收到错误 - 找不到没有 ID 的 Buysignal

买入信号新方法

定义新

@buy_signal_idx = params[:buysignal_id]

@bid_signal = BidSignal.new

结束

买入信号创建方法

定义创建

@a_buysignal = Buysignal.all
@a_buysignal = @a_buysignal.find(@buy_signal_idx)
@a_bid_signal = @a_buysignal.bid_signals.build(bid_signal_params)

  if @a_bid_signal.save
    flash[:success] = "Bid Signal Successfully Created!"
    redirect_to @a_bid_signal

  else
    render action: 'new'

  end

结束

但是,如果我替换: @a_buysignal = @a_buysignal.find(@buy_signal_idx)

与:

@a_buysignal = @a_buysignal.find(300)

一切正常(当然,除了我的所有出价信号都与 id 为 300 的买入信号相关)。

就好像 @buy_signal_idx 在 create 方法中不可访问。我已经尝试将其抽象出来,以便 new 调用一个类通过它自己的新方法为投标信号设置一个变量,然后使用 getter 在投标信号创建方法中返回 buy_signal_idx。但我得到了相同的结果。

我想我明白了,如果我在一个方法中启动一个实例变量,该变量应该可以被该对象实例中的其他方法访问 - 但它不起作用。

我知道我很愚蠢并且错过了一些基本的东西 - 但它是什么?

【问题讨论】:

  • 你使用的是rails,对吗?
  • 可能会在新表单的隐藏字段中呈现值,然后使用它通过参数哈希填充 id...

标签: ruby-on-rails ruby variables instance


【解决方案1】:

每次新请求进来时,rails 都会实例化控制器类的新实例——因此之前请求中设置的实例变量不再可用(持有该变量的控制器对象现在已被销毁)。这是网络无状态的结果——在两个单独的请求之间保留任何形式的数据的唯一方法是将其存储在会话中或随每个请求一起发送(不是真正存储变量,但你知道我的意思)

最佳选择实际上取决于您在这里的路线。如果您使用嵌套资源,params[:buysignal_id] 将作为 url 的一部分(而不是查询字符串)传递,因此它也可以在您的 create 操作中访问。所以你可以简单地做:

# create action
@a_buysignal = Buysignal.find(params[:buysignal_id])

如果它是查询字符串的一部分,那么我会这样做:

# new action
@buy_signal_idx = session[:byusignal_id] = params[:buysignal_id]

# create action
@a_buysignal = Buysignal.find(session[:buysignal_id])

另一种解决方案是在表单中添加一个带有params[:buysignal_id] 值的隐藏字段,并在创建操作中使用它,但我认为这有点麻烦。

【讨论】:

  • 太棒了!非常感谢,您解释生命周期的方式现在很有意义。我在会话中存储/检索。现在一切都很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2012-12-14
  • 2021-09-22
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多