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



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

我有一个型号叫BidSignal,它与一个型号BuySignal有关。BuySignal具有许多BidSignal,并且BidSignl属于BuySignl。

当我在BidSignal控制器中使用新方法创建新的BidSignl时,我想捕获与其相关的BuySignal,这样我就可以在BidSsignal创建方法中保存关系。我目前正在通过在对新方法的调用中将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的购买信号有关)。

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

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

我知道我很愚蠢,错过了一些基本的东西——但这是什么?

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

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

# 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]值的隐藏字段,并在创建操作中使用它,但我认为这有点麻烦。

最新更新