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

时间:2014-09-23 22:53:49

标签: ruby-on-rails ruby variables instance

我已尝试过并尝试在其他地方找到答案,但我无法解决此问题。

我有一个与名为BuySignal的模型相关的模型调用BidSignal。 BuySignal有许多BidSignals,BidSignal属于BuySignal。

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

出价信号新方法

def new

@buy_signal_idx = params[:buysignal_id]

@bid_signal = BidSignal.new

出价信号创建方法

def create

@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信号create方法中返回buy_signal_idx。但我得到了同样的结果。

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

我知道我是愚蠢的,缺少一些基本的东西 - 但它是什么?

1 个答案:

答案 0 :(得分:2)

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