2017-12-21 2 views
0

두 개의 양식 입력을 하나의 데이터베이스 입력 매개 변수로 결합하려고합니다. 내 양식에서 나는 시간 (6-22) 및 분 (0-55)에 대한 드롭 다운을 가지고 있고 db에서 start_hour * 60 + start_mins로 계산 된 정수를 갖고 싶으면 'start'열이 있습니다.두 개의 양식 입력을 하나의 db 항목으로 결합하기

나의 양식은 다음과 같습니다

<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 

내가 내 컨트롤러에 문제가 - 나는으로 시작 전달하는 방법을 모른다 db. 나는로 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을 시도 : 시작하고 아무것도 정말 작동하지 않습니다 -하지만 난 어둠에 머물 인정한다. 나는 아주 누락 것 같은 DI 느낌 : 지금 내가 받고 오류 : "self.start"버전에 대한

undefined method `start' for # Did you mean? status

및 대한

undefined method `start_mins' for # Did you mean? start start_was

"시작"과 "@start"버전 여기의 기초. 저를 올바른 방향으로 안내해 주시겠습니까? 모델에 attr_accessor :start_hours, :start_mins를 추가

create_table "klasses", force: :cascade do |t| 
    t.string "name" 
    t.string "teacher" 
    t.string "day" 
    t.integer "start" 
    t.integer "duration" 
end 
+2

[한 속성에 다중 입력란 사용] (https://stackoverflow.com/questions/11144030/using-multiple-input-fields-for-one-attribute) –

+0

@VaneTrajkov 감사합니다. 나는 그 1 tbh를 놓쳤다. 나는 그 중 하나를 사용하려고하는데, 나는 오류를 없애기는하지만 여전히 : db의 start attr은 0으로 설정되어있다. – Malvinka

답변

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 %> 

을, 당신은 시작 PARAM을 계산하는 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 

희망이 있습니다.

+0

고마워요! 그것은 작동합니다! 단 한가지 : 첫 번째 줄에서 솔루션을 사용할 때 "정의되지 않은 지역 변수 또는 메서드'klass '"(예, 내 모델 이름은 Klass 임)을 사용할 때 오류가 발생했습니다. 나는 <% = form_for @klass do |를 사용한다. f | %> 그런 식으로 작동합니다. 차이점은 무엇입니까? – Malvinka

+0

솔직히 말해서 어디에 문제가 있을지 잘 모르겠습니다. Rails 5.1에서 ['form_with'는 form_for와 form_tag의 통합입니다] (http://edgeguides.rubyonrails.org/5_1_release_notes.html#unification-of-form-for-and-form-tag-into-form-with)). 샘플 <% = form_with (model : @klass, local : true) do | f |에'@'기호를 입력 해 보았습니까? %>' –

+0

네, 시도해 봤는데 다른 문제가 있습니다. (미안하지만, 지금은 정확히 확인할 수 없습니다. 도와 주셔서 감사합니다! – Malvinka

1

시도 : 그 중요한 경우

는 내 DB 스키마입니다. 또한 contact_params에서이 두 필드를 허용 목록에 추가하십시오. attr_accessor에 대한 자세한 내용은 here을 (를) 찾을 수 있습니다.

+1

고마워! 그게 내가 가진 오류를 제거하는 데 도움이됩니다. 하지만 여전히 전달하는 데 문제가 있습니다 : 시작 값 db. 이제 엔트리가 추가되지만 값은 0으로 설정됩니다. – Malvinka

+0

실제로 모델을 변경하여 'start_hours'및 'start_mins'를 데이터베이스에 저장합니다. 'start'는 필요할 때 시간을 계산하는 모델의 메소드 일 수 있습니다. 이렇게하면 필드가 여전히 분리되어 있기 때문에 동일한 양식을 사용하여 모델을 편집 할 수도 있습니다. –

+0

하지만 나는이 두 가지 별도의 값을 필요로하지 않습니다. 이것들은 단지 폼을 좀 더 읽기 좋게 만들뿐입니다 (text_field를 사용할 수 있고 HH : MM 폼을 요구할 수 있습니다. 더 바보가 될 것이라고 결정했습니다). 모든 곳에서 정수형. db에 추가 col을 추가 할 때 요점을 볼 수 없습니다 ... – Malvinka

관련 문제