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

时间:2017-12-21 20:19:25

标签: ruby-on-rails ruby database forms

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

2 个答案:

答案 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

希望这有帮助!