ruby on rails:实例变量返回nil

时间:2016-09-05 23:26:47

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

我一直在尝试使用create函数将输入数据从我的表单推送到数据库,但是create function中的实例变量不断返回' nil '并在'之后开始交易',它确实'回滚交易'

模型函数在我获得所需的解析数据时工作正常, timetables_params 函数也是如此。但是 timetables_params [:start_time] 总是返回'nil',即使 timetables_params 返回所有 start_time 值并且< em> 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

2 个答案:

答案 0 :(得分:0)

您的user可能没有设置belongs_to :user,我在您的代码中的任何位置都没有看到它。这就是为什么它会回滚,你可能需要在你的时间表模型中user_id。我的建议如下:

代替:

@timetable = Timetable.create(timetables_params)

使用构建:

@timetable = current_user.timetables.build(timetables_params)

答案 1 :(得分:0)

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

<强>模型

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会自动执行此操作