【问题标题】:ruby on rails: instance variable returns nilruby on rails:实例变量返回 nil
【发布时间】:2016-09-05 23:26:47
【问题描述】:

我一直在尝试使用 create 函数将输入数据从我的表单推送到数据库,但是 create 函数中的实例变量不断返回 'nil' 并且在 '开始事务',它执行'回滚事务'

当我获得所需的解析数据时,模型函数工作正常,timetables_params 函数也是如此。但是 timetables_params[:start_time] 总是返回 'nil' 即使 timetables_params 返回所有 start_time 值并且 end_time 值。

我该如何解决这个问题?

这是我的控制器

def index
  @user = current_user
  @timetables = @user.timetable.all
end

def new
  @timetable = Timetable.new
end

def create
 timetables_params[:start_time] = Timetable.parse_timetable_time(timetables_params, 'start')
 timetables_params[:end_time] = Timetable.parse_timetable_time(timetables_params, 'end')
 @timetable = Timetable.create(timetables_params)
 if @timetable.save
   flash[:success] = "Done"
 else
   render 'new'
 end
end

private
  def timetables_params
     params.require(:timetable).permit(:user_id, :start_time, :end_time)
  end
end

这是我的模型

belongs_to :user
attr_accessor :user, :start_time, :end_time

def self.parse_timetable_time(hash, type)
   date_string = hash["#{type}_time(1i)"].to_s + "=" + hash["#{type}_time(2i)"].to_s + "=" + hash["#{type}_time(3i)"]
   Time.parse(date_string)
end

【问题讨论】:

  • 为什么事务回滚?控制台输出/日志还包括什么?
  • 它只包括:<:parameters>"", "start_time(2)"=>"1", "start_time(3i)"=>" 1", "start_time(4i)"=>"00", .....} 允许:true> 开始事务回滚事务在布局/应用程序中渲染时间表/new.html.erb
  • @timetable = Timetable.create(timetables_params)中的create改成create!,下面的save改成save!,然后重新运行。然后查看控制台看看有没有抛出异常。
  • (hash.type) 中有错字应该是逗号
  • 更改创建和保存返回用户必须存在的错误,但通过current_user.timetables.build(timetables_params)解决。但是,除了 user_id 之外,它仍然返回“nil”值。

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-5


【解决方案1】:

你可能没有设置user,因为它是belongs_to :user,我在你的代码中没有看到它。这就是它回滚的原因,您可能在 Timetable 模型中需要user_id。我的建议如下

代替:

@timetable = Timetable.create(timetables_params)

使用构建:

@timetable = current_user.timetables.build(timetables_params)

【讨论】:

  • 至少返回带有 user_id 的 @timetable 但所有其他值(例如 id、start_time 和 end_time)仍然为零。我不明白为什么 timetables_params[:start_time] = Timetable.parse_timetable_time(timetables_params, 'start') 没有赋值
  • 不建议更改参数。使用 @timetable.start_time = ... 使用 byebug 并确保您的函数 parse_timetable_time 按预期工作。
  • 我的 parse_timetable_time 运行良好,但是使用 @timetable.start_time 不起作用,因为 @timetable 仍然为除 user_id 之外的所有内容返回“nil”值(即使使用 @timetable = current_user.timetables.build(timetables_params)
【解决方案2】:

感谢以上所有帮助,但事实证明我只需要在模型中添加以下几行并修改控制器创建功能:

型号

validates :user_id, presence: true
validates :start_time, :end_time, presence: true

控制器

def create 
  @timetable = current_user.timetables.build(timetables_params)
  if @timetable.save
    flash[:success] = "Done"
  else
    render 'new'
  end

而且,我不一定需要解析日期时间值,Rails 会自动完成

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多