Ruby on rails 为什么变量在new和create方法中不可用
我正在尝试做一个表单提交,其中新方法初始化变量,在create方法中,变量应该保存到模型中。但是在create方法中,我得到了该变量的nil。所以我也在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
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)
谢谢。但它比这复杂得多:)