所以我在我看来_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' %>
这在我的控制器中
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
然后我的控制器中的更新
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
将不会更新。它再次呈现此视图但错误地表明map
没有方法nil
(因此对于@select_hours
)。
那么我该如何解决这个问题呢?
答案 0 :(得分:1)
您可以在控制器中使用回调并为这两个操作设置@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也可以在回调之前设置。
我已经添加了平面地图来创建并填充从该范围开始的数组,它是&#34;相同的&#34;和以前一样,只是你不需要初始化数组,使用for循环,并为它推送内容。