[Rails] Form 객체의 date_보조 객체를 선택할 때 발생할 수 있는 UnknownAttribute 오류 정보

14570 단어 RubyRails

먼저


Form 객체에 날짜 등을 저장할 때 사용하는 보조 방법인 "date_select"에서 발생하기 쉬운 UnknownAttribute 오류의 원인과 해결 방법을 요약했습니다.

카탈로그

  • Form 객체가 무엇입니까
  • ActiveModel::Model
  • attr_accessor
  • date_select 표 보조 프로그램
  • UnknownAttribute 오류
  • ActiveRecord::AttributeAssignment
  • 사이트 참조
  • Form 객체란 무엇입니까?


    한 폼에서 여러 테이블에 데이터를 저장하고 업데이트하는 데 사용됩니다.rails의 모델은 데이터베이스에 있는 표에 대응하는 정보를 포함하지만, From 대상은 이 표의 정보를 한데 모인다.
    예를 들어 날짜 sdate를 저장합니다.rb와 시간표를 저장하는 schedule.rb라는 두 개의 모델과 그에 대응하는 표가 있다고 가정하십시오.
    ①sdate.rb

    ① - 1sdates 표

    ①-2 sdate.rb의migration 파일 (지정열 ":sdate,:syear,:smonth,:sday")
    class CreateSdates < ActiveRecord::Migration[6.0]
      def change
        create_table :sdates do |t|
          t.date :sdate 
          t.integer :syear
          t.integer :smonth
          t.integer :sday
          t.timestamps
        end
      end
    end
    
    ②schedule.rb

    ② - 1schedule 표

    ※subject,start_time,end_time 등에 관해서는 아직 완성되지 않아서 비어 있습니다.또한null:false를 지정하지 않았기 때문에null을 저장할 수 있고 + 오류가 발생하지 않습니다.
    ②-2 schedule.rb의migration 파일(지정된 열:subject,:start_time,:end_time,:sdate)
    
    class CreateSchedules < ActiveRecord::Migration[6.0]
      def change
        create_table :schedules do |t|
          t.string :subject
          t.time :start_time
          t.time :end_time
          t.references :sdate, foreign_key: true
          t.timestamps
        end
      end
    end
    
    ③ 위 ①과 ②의 Form 객체 만들기 ->sdate_schedule.rb
    
    class SdateSchedule
      include ActiveModel::Model
      attr_accessor :subject, :start_time, :end_time, :sdate, :syear, :smonth, :sday
    
      def save
        sydate = Sdate.create(sdate: sdate ,syear: syear, smonth: smonth, sday: sday)
        Schedule.create(subject: subject, start_time: start_time, end_time: end_time, sdate_id: sydate.id)
      end
    
    end
    

    ActiveModel::Model


    Form 객체는 Ruby 파일에서 클래스를 만들고 (이 경우 클래스 이름은 SdateSchedule)save 방법을 정의합니다.이save 방법을 정의하여 컨트롤러에서 SdateSchedule 클래스의 실례를 생성하고save 방법을 기술한 후 데이터를 저장합니다.이제 활성 모드::모드에서 모델을 생성하고 저장하고 업데이트할 수 있습니다.이것은 include 및 SdateSchedule에서 사용해야 합니다.

    attr_accessor


    클래스 외부에서도 변경하고 저장할 수 있도록 클래스에 정의된 실례 변수를 지정합니다.Form 객체의 attr_accessor를 사용하여 저장할 변수를 지정하지 않으면 클래스 외에는 컨트롤러로 값을 쓸 수 없습니다.입력 폼에서 데이터를 매개 변수로 보내지만, 컨트롤러가 데이터를 획 매개 변수로 수신한 후,Form 대상의 실례를 호출하여 저장합니다.
      def save
        sydate = Sdate.create(sdate: sdate ,syear: syear, smonth: smonth, sday: sday)
        Schedule.create(subject: subject, start_time: start_time, end_time: end_time, sdate_id: sydate.id)
      end
    
    변수sydate에서 활성 모델을 사용합니다::모델의create 방법으로 Sdate 모델의 값을 저장하고 대입합니다.Schedule 모델도 create 방법을 사용하여 모델의 값을 저장합니다.Sdate 모델과 달리 Schedule은 Sdate의 키를 저장해야 하기 때문에 상술한sydate의 id 정보도'sdate_id:sydate.id'형식으로 키를 저장합니다.
    ④ 컨트롤러(일부)
    두 모델 sdate.rb와 schedule.rb 중 하나에 컨트롤러를 제공하고 대상에서 실행합니다.이런 상황에서 schedule.rb에 대응하는shcedules 컨트롤러로 처리되었습니다.
    class SchedulesController < ApplicationController
    (・・・前略)
    
    def new
      @sdate_schedule = SdateSchedule.new
    end
    
    def create
      @sdate_schedule = SdateSchedule.new(schedule_params)
      @sdate_schedule.save
      redirect_to schedules_path
    end
    
    private
    
    def schedule_params
      params.require(:sdate_schedule).permit(:subject, :start_time, :end_time, :sdate, :syear, :smonth, :sday)
    end
    
    
    schedule_파라미터라는 방법으로 파라미터를 수신하고 new 방법으로 실례를 생성합니다@sdate_schedule.create 방법은 schedule_파라미터를 전달하고Form 대상에 정의된save 방법으로 데이터를 데이터베이스에 저장합니다.

    date_select 표 보조 프로그램


    date_select.이 경우 sdate 모델에date 형식의 데이터를 저장하기 위해date_select 창 조수를 사용했습니다.
    <h1>授業新規登録</h1>
    <%= form_with model: @sdate_schedule, url: schedules_path, local: true do |f| %>
      <%= raw sprintf(
                      f.date_select(
                                    :sdate,
                                    {:discard_year => true,:use_month_numbers => 
                                     true,date_separator: '%s'},
                                   ),
                                    "<p></p>") + "<p></p>" %>
       <%= f.submit "新規登録" ,class:"#" %>
    <% end %>
    
    입력 양식에 날짜를 입력하고 새 등록 버튼을 누릅니다.

    이렇게 하면 순조롭게 진행될 줄 알았는데 다음과 같은 오류가 발생할 줄은 생각지도 못했다.

    이름 없는 속성 오류


    UnknownAttribute 오류는 알 수 없는 속성을 나타냅니다.폼을 입력하면 데이터를 매개 변수로 보내지만 해당하는 데이터가 없습니다.왜 이런 일이 일어났을까?원인을 조사하기 위해params를 입력하고 내용을 살펴보았다.

    request로 보낸 파라미터는 방금 입력한 날짜 인자를 받았습니다.하지만 보낸 매개 변수의 형상은 좀 다르다.sdate열을 년'sdate(1i)', 월'sdate(2i)', 일'sdate(2i)', 일'sdate(3i)'로 분해합니다.sdate 테이블에는 sdate 열만 있는데 3열로 나누어져 있어서 저장할 수 없습니다.

    ActiveRecord::AttributeAssignment


    활동 레코드: 속성 할당이 문제를 해결하는 데 도움이 됩니다.공식 홈페이지에서 확인한 "Allows you to set all the attributes by passing in a hash of attributes with keys matching the attribute names."디버깅을 진행하다.즉, 속성 이름과 일치하는 키를 가진 속성 블록을 전달하고 모든 속성을 설정할 수 있다.이 활동 기록::속성 분배를 대상으로부터 설명하면 sdate(1i) 등에서 분산된 속성 값을 한 덩어리로 전달합니다.

    sdate_schedule."include ActiveRecord:::속성 할당"을 rb에 추가합니다.
    이제 오류가 제거되어 테이블에 저장할 수 있습니다.
  • 사이트 참조
  • https://api.rubyonrails.org/classes/ActiveModel/AttributeAssignment.html#method-i-assign_attributes
    https://railsguides.jp/active_model_basics.html
    https://qiita.com/Tiima/items/b14c73df98d0465cbb52
    https://naokirin.hatenablog.com/entry/2019/02/20/231317
    https://qiita.com/ngron/items/dd3cd8eb8ef58bd1c1fc

    좋은 웹페이지 즐겨찾기