前提・実現したいこと
Ruby on rails 初心者です。
現在、ECサイトの構築を行っており、つまずいたのはDBへの登録処理です。
onKeyUp:"AjaxZip3.zip2addr(this,'','prefecture','address');"
を使って
郵便番号を入力すると都道府県や住所の一部が自動で挿入される仕組みを作り、そのデータをDBへ登録しようとしました。
発生している問題・エラーメッセージ
Validation failed: Prefecture can't be blank, Address can't be blank.
都道府県と住所がテーブルに登録されません。
ログを見ると、記載した都道府県と住所の情報は送られていますが、
テーブルにsaveする時にバリデーションエラーが出てしまいます。
onKeyUp:"AjaxZip3.zip2addr(this,'','prefecture','address');"
を外して、都道府県や住所も全て入力すれば
しっかりとDBへは登録されます。
ログ Parameters: {"utf8"=>"✓", "authenticity_token"=>"M7JNCtF75uixj6s6kw8pZk0ChuDN4N8Ev8f1I0mYt0x75HyDOi1fG/EWf36RT8y2NKrxgMh5J7+JnLNeh0SqRA==", "farmer"=>{"name"=>"XXX農園", "email"=>"ccc@ccc.com", "tel"=>"00000000000", "postal_code"=>"0608588", "comment"=>"テストです。", "farmer_images_attributes"=>{"0"=>{"farmer_logo"=>#<ActionDispatch::Http::UploadedFile:0x00007fd6e90f76a8 @tempfile=#<Tempfile:/var/folders/19/8dw27p954zv9p2k_90hvh3ww0000gn/T/RackMultipart20201025-19521-ckzet6.png>, @original_filename="lemon.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"farmer[farmer_images_attributes][0][farmer_logo]\"; filename=\"lemon.png\"\r\nContent-Type: image/png\r\n">, "farmer_image"=>#<ActionDispatch::Http::UploadedFile:0x00007fd6e90f7360 @tempfile=#<Tempfile:/var/folders/19/8dw27p954zv9p2k_90hvh3ww0000gn/T/RackMultipart20201025-19521-h9zj8i.png>, @original_filename="apple.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"farmer[farmer_images_attributes][0][farmer_image]\"; filename=\"apple.png\"\r\nContent-Type: image/png\r\n">}}, "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "prefecture"=>"北海道", "address"=>"札幌市中央区", "commit"=>"登録"} (0.1ms) begin transaction ↳ app/controllers/farmers_controller.rb:10 Farmer Exists (0.3ms) SELECT 1 AS one FROM "farmers" WHERE LOWER("farmers"."email") = LOWER(?) LIMIT ? [["email", "ccc@ccc.com"], ["LIMIT", 1]] ↳ app/controllers/farmers_controller.rb:10 (0.2ms) rollback transaction ↳ app/controllers/farmers_controller.rb:10 Completed 422 Unprocessable Entity in 142ms (ActiveRecord: 2.2ms)
該当のソースコード
(views/farmers/new.html.erb)一部記載 ここで登録したい商品の情報を記入(下記はタグを複数選択可) <%= form_for @product_resister, html: {class: "new_product"} do |f| %> <%= f.label :postal_code, "郵便番号", class:"form_field" %> <%= f.text_field :postal_code, class:"form_area", onKeyUp:"AjaxZip3.zip2addr(this,'','prefecture','address');", required:"required" %> <%= f.label :prefecture, "都道府県", class:"form_field" %> <%= f.text_field :prefecture, class: 'form_area', required:"required" %> <%= f.label :address, "住所", class:"form_field" %> <%= f.text_field :address, class: 'form_area', required:"required" %> <%= f.submit "登録", class:"resister_btn"%> <% end %>
(farmer.rb) class Farmer < ApplicationRecord attr_accessor :remember_token before_save {self.email = email.downcase } validates :name, presence: true, length: {maximum: 50} VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i validates :email, presence: true, length: {maximum: 255}, format: {with: VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false} has_secure_password validates :password, presence: true, length: {minimum: 6}, allow_nil:true validates :tel, presence: true, length: {in: 10..11} validates :postal_code, presence: true validates :prefecture, presence: true validates :address, presence: true validates :comment, presence: true has_many :products, dependent: :destroy has_many :farmer_images, dependent: :destroy accepts_nested_attributes_for :farmer_images def Farmer.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end def Farmer.new_token SecureRandom.urlsafe_base64 end def remember self.remember_token = Farmer.new_token update_attribute(:remember_digest, Farmer.digest(remember_token)) end def authenticated?(remember_token) return false if remember_digest.nil? BCrypt::Password.new(remember_digest).is_password?(remember_token) end def forget update_attribute(:remember_digest, nil) end end
farmers_Controller.rb class FarmersController < ApplicationController def new @farmer_resister = Farmer.new @farmer_resister.farmer_images.build end def create @farmer_resister = Farmer.new(farmer_params) if @farmer_resister.save! farmer_log_in @farmer_resister flash.now[:success] = "農家の登録が完了しました。" redirect_to farmer_path(@farmer_resister.id) else flash.now[:danger] = "農家登録に失敗しました。お手数ですが、もう一度登録しなおしてください。" render "new" end end private def farmer_params params.require(:farmer).permit(:name, :email, :tel, :postal_code, :prefecture, :address, :comment, :password, :password_confirmation, farmer_images_attributes: [ :id, :farmer_logo, :farmer_image ]) end end
回答1件
あなたの回答
tips
プレビュー