我正在尝试将两个表单输入组合到一个数据库条目参数中。在我的表单中,我有下拉数小时(6-22)和分钟(0-55),在我的数据库中我有一个列'开始',我希望有一个整数计算为start_hour * 60 + start_mins。
我的表单看起来像这样:
<div class="form-group">
<%= f.label :start_hour %>
<%= f.select :start_hour, 6 .. 22, class: 'form-control' %>
<%= f.label :start_mins %>
<%= f.select :start_mins, 00 .. 55, class: 'form-control' %>
</div>
在我的模型中,我添加了before_validation:
before_validation :generate_starttime
def generate_starttime
self.start= '#{:start_hour}' * 60 + '#{start_mins}'
end
我的控制器有问题 - 我不知道如何将启动传递给数据库。我把params作为:
def create
@klass = Klass.new(contact_params)
if @klass.save
flash[:success] = "Class added"
else
flash[:error] = @klass.errors.full_messages.join(", ")
end
redirect_to new_klass_path
end
我试过self.start和@start并且:开始并没有什么真正有效 - 但我承认我一直呆在黑暗中。现在我收到并收到错误:
未定义的方法`start'for#Did 你的意思是?状态
表示“self.start”版本和
#p>未定义的方法`start_mins'代表#你呢 意思? start start_was
代表“:start”和“@start”版本:D我觉得我在这里缺少一些非常基础知识。你能指出我正确的方向吗?
如果那是重要的,那就是我的数据库模式:
create_table "klasses", force: :cascade do |t|
t.string "name"
t.string "teacher"
t.string "day"
t.integer "start"
t.integer "duration"
end
答案 0 :(得分:2)
尝试将attr_accessor :start_hours, :start_mins
添加到您的模型中。此外,将contact_params
中的这两个字段列入白名单。您可以在attr_accessor
上找到有关here的更多信息。
答案 1 :(得分:2)
这是一种可能的解决方案。请注意,下面的代码示例假设模型名称为Klass
并根据它命名所有内容。随意更新命名以提供您的应用程序名称
您的观点如下所示:
<%= form_with(model: klass, local: true) do |f| %>
...
<div class="form-group">
<%= f.label :start_hour %>
<%= f.select :start_hour, 6 .. 22, class: 'form-control' %>
<%= f.label :start_mins %>
<%= f.select :start_mins, 00 .. 55, class: 'form-control' %>
</div>
...
<% end %>
在Controller中,您定义一个将计算起始参数的before_action
class KlassesController < ApplicationController
before_action :fix_params, only: [:create, :update]
...
private
def klass_params
params.require(:klass).permit(:name, :teacher, :day, :start, :duration)
end
def fix_params
if params[:klass].blank?
# parent not provided
return
end
start_hour = params[:klass].delete(:start_hour)
start_mins = params[:klass].delete(:start_mins)
if start_hour.blank? || start_mins.blank?
# consider handling this case
else
params[:klass][:start] = start_hour.to_i * 60 + start_mins.to_i
end
end
...
end
和您的创建处理程序
def create
@klass = Klass.new(klass_params)
if @klass.save
flash[:success] = "Class added"
else
flash[:error] = @klass.errors.full_messages.join(", ")
end
redirect_to new_klass_path
end
希望这有帮助!