将两个表单输入组合到一个db条目中

问题描述 投票:0回答:2

我正在尝试将两个表单输入组合到一个数据库条目参数中。在我的表单中,我有下拉数小时(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#你的意思是?状态

对于“self.start”版本和

对于#,未定义的方法`start_mins'是什么意思?开始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
ruby-on-rails ruby database forms
2个回答
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

希望这可以帮助!


2
投票

尝试将attr_accessor :start_hours, :start_mins添加到您的模型中。此外,将这两个字段列入你的contact_params白名单。你可以在attr_accessor找到更多关于here的信息。

© www.soinside.com 2019 - 2024. All rights reserved.