gpt4 book ai didi

ruby-on-rails - 在 Controller 中渲染 View 后出现 nil 的 NoMethodError

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:58 25 4
gpt4 key购买 nike

所以我认为 _form.erb 是这样的:

<div class="form-group">
<%= f.label :start_hour %><br>
<%= f.select :start_hour, @select_hours.map {|value| [value, value]} %>
</div>

这在 edit.erb 中:

<%= render 'form' %>

这在我的 Controller 中

    def edit
@user = current_user
@employee = @user.employee
@hour = @employee.working_hours.find(params[:id])
@select_hours = Array.new
for i in 0..12
@select_hours.push("#{07+i}:00")
@select_hours.push("#{07+i}:30")
end
end

然后我在我的 Controller 中更新

def update
@employee = current_user.employee
@hour = @employee.working_hours.find(params[:id])
if @hour.update(working_hour_params)
redirect_to employee_working_hours_path(@employee)
else
render :edit
end
end

这是我的问题:

当我点击更新并且有错误的 start_hour(自定义验证,在创建而不是编辑时有效),所以 @hour 将不会更新。它再次呈现此 View ,但错误是没有方法 map 用于 nil(因此用于 @select_hours)。

那么我该如何解决这个问题呢?

最佳答案

您可以在您的 Controller 中使用回调并为这两个操作设置@select_hours,这样如果更新失败,该值将存在,但您不必分配变量两次,如:

before_action :set_select_hours, only: %i[edit update]
before_action :set_employee, only: %i[edit update]
before_action :set_hour, only: %i[edit update]

def edit; end

def update
if @hour.update(working_hour_params)
redirect_to employee_working_hours_path(@employee)
else
render :edit
end
end

private

def set_select_hours
@select_hours = (0..12).flat_map do |index|
["#{07 + index}:00", "#{07 + index}:30"]
end
end

def set_employee
@employee = current_user.employee
end

def set_hour
@hour = @employee.working_hours.find(params[:id])
end

我认为@employee 也可以在 before 回调中设置。

我添加了平面 map 来创建和填充从范围开始的数组,它和以前“一样”,只是你不需要初始化数组,使用 for 循环,并为它推送内容.

关于ruby-on-rails - 在 Controller 中渲染 View 后出现 nil 的 NoMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47799383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com