Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么变量在new和create方法中不可用_Ruby On Rails - Fatal编程技术网

Ruby on rails 为什么变量在new和create方法中不可用

Ruby on rails 为什么变量在new和create方法中不可用,ruby-on-rails,Ruby On Rails,我正在尝试做一个表单提交,其中新方法初始化变量,在create方法中,变量应该保存到模型中。但是在create方法中,我得到了该变量的nil。所以我也在create方法中创建了变量。有人能帮我理解发生了什么事吗 这是我的密码 class AddressesController < ApplicationController def new byebug @addr = Address.new end def create

我正在尝试做一个表单提交,其中新方法初始化变量,在create方法中,变量应该保存到模型中。但是在create方法中,我得到了该变量的nil。所以我也在create方法中创建了变量。有人能帮我理解发生了什么事吗

这是我的密码

class AddressesController < ApplicationController

    def new
        byebug
        @addr = Address.new
    end

    def create 

        @addr = Address.new
        byebug
        user = {}
        user[:user_id] = StudioOrder.find_by(user_id: spree_current_user.id).user_id
        @addr.update_attributes(user)
        @addr.update_attributes(getparams)
        byebug
        @addr.save

    end

    def getparams
        params.require(:address).permit(:user_id, :name, :address, :mobile, :city, :state, :pincode)
    end

end
类地址控制器
您所说的变量是@addr

这是完全正常的。它是为AddressController类的该实例定义的变量

当create方法执行时,这是AddressController类的一个新实例,不能访问前一个实例的实例变量

关于这一行

user[:user_id] = StudioOrder.find_by(user_id: spree_current_user.id).user_id
它可以大大简化为

user[:user_id] = spree_current_user.id
无论如何,控制器操作的简化版本可能是

def new
  @addr = Address.new
end

def create 
  @addr = Address.new
  @addr.assign_attributes(getparams)
  @addr.user = spree_current_user
  if @addr.save
    flash[:notice] 'save successful'
    redirect_to root_path
  else
    flash.now[:error] 'please correct errors below'
    render :new
  end
end

假设
spree\u当前\u用户
有多个:地址
,并且它必须存在才能访问您可以执行的地址控制器

def create 
  @addr = spree_current_user.addresses.new(get_params)  
  if @addr.save
    flash[:notice] 'save successful'
    redirect_to root_path
  else
    flash.now[:error] 'please correct errors below'
    render :new
  end
end

地址始终属于用户?哪个变量为nil?未定义的任何实例变量的值将为
nil
。因此,如果某个值为零,它要么被设置为零,要么尚未定义。请记住,rails从零开始处理每个请求:如果您执行新操作,定义一些内容,呈现一个表单,然后提交表单,那么旧变量仍然不会被定义:您每次都需要重新定义它。是的,这正是我的困惑所在。当我在新方法中定义@addr变量时,我希望该变量在create方法中可用。结果发现那是不可用的。那么,如果不太模糊,我们如何在不同的实例之间传递变量呢。请澄清,谢谢@我刚才说的MaxWilliams@addr变量。很抱歉迟了答复@pavana实际上user_id是该模型地址中的一列,所以我应该执行@addr.user_id=spree_current_user?而不是@addr.user。并且感谢您指出长代码行:)如果建立了关联,那么Rails就会理解“user”,并且
@addr.user=spree\u current\u user
实际上与
@addr\u user\u id=spree\u current\u user.id
使用
user
(与
user\u id
不同的是,它更抽象……将来,如果您的设计发生变化,使(例如)地址通过其他模型属于用户,则抽象代码仍然有效。引用“user\u id”的代码这意味着您的控制器必须知道太多关于如何构建关系的信息。地址模型中有一个user\u id列,那么为什么我需要有很多关系?请您解释一下?如果您不这样做,请执行此
spreee\u current\u user.addresses.new(获取参数)
不起作用是的,正确。但是我如何重写SpreeUser以与我的地址模型建立关系。我从未使用过Spree,所以我不知道。你可以执行
@addr=address.new(get_params.merge(user\u id:current\u user.id)
谢谢。但它比这复杂得多:)