在New方法中定义的实例变量在Create方法中不可访问

鼻息肉

我试图在其他地方找到答案,但是我无法解决此问题。

我有一个名为BidSignal的模型,该模型与一个名为BuySignal的模型有关。BuySignal有许多BidSignal,而BidSignal属于BuySignal。

当我在BidSignal控制器中使用新方法创建新的BidSignal时,我想捕获与其相关的BuySignal,因此可以将关系保存在BidSignal创建方法中。我目前正在通过在对新方法的调用中将buysignal_id传递给BidSignal控制器来做到这一点。但是,当我创建BidSignal记录并尝试调用buysignal_id来查找BuySignal记录时,出现了错误-无法找到没有ID的Buysignal

出价信号新方法

def新

@buy_signal_idx = params[:buysignal_id]

@bid_signal = BidSignal.new

结尾

出价信号创建方法

def创建

@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。但我得到相同的结果。

我想我知道,如果我在某个方法中启动实例变量,则该对象实例中的其他方法应该可以访问该变量-但它不起作用。

我知道我很愚蠢,缺少一些基本知识-但这是什么?

BroiSatse

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

最佳选择实际上取决于您在这里的路线。如果您使用的是嵌套资源,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]在表单中添加一个带有的隐藏字段,并在您的create动作中使用它,但是我认为这有点麻烦。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章