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

时间:2016-02-17 11:46:12

标签: ruby-on-rails

我正在尝试进行表单提交,其中new方法初始化变量,而在create方法中,变量应该保存到模型中。但是在create方法中,我得到的变量为零。所以我最终也在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

2 个答案:

答案 0 :(得分:1)

您正在谈论的变量是@addr

这是完全正常的。它是为AddressesController类的THAT INSTANCE定义的变量。

当create方法执行时,它是AddressesController类的一个新实例,并且无法访问前一个实例的实例变量。

关于这条线......

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

答案 1 :(得分:0)

假设spree_current_user has_many :addresses并且必须存在才能到达地址控制器,您可以

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