테이블에 없는 열에도 값을 넣어 보낼 수 있는 건

4828 단어 Rails

소개



EC사이트를 만들어 보았습니다만, 이하의 이미지와 같이, 전달처를 몇개의 선택사항중에서 체크 박스로 선택하는 장면에서 어떻게 하면 좋은지 조금 당황했기 때문에 정리해 둡니다.

           

몰랐던 것



선택지에 값을 갖게 해, 그 값에 의해 콘트롤러로 처리를 나누는 곳까지는 상상이 붙었습니다만, 이번으로 말하면, 주문 테이블에 선택지(option) 컬럼은 없기 때문에 어떻게 하면 좋을까 당황했습니다.
 일단, option = 0 그렇다면 「자신의 주소」, option = 1 그렇다면 「등록이 끝난 주소로부터 선택」으로서 이하와 같이 써 보았습니다.

orders/new.html.erb
<%= form_with model: @order, url: orders_confirm_path , method: :post, local: true do |f| %>

    <div class="form-group">
      <h6>お届け先</h6>
        <%= f.radio_button :option, "0" %>
        <%= f.label 'ご自身の住所' %><br>
        <%= '〒' %>
        <%= current_customer.postal_code %>
        <%= current_customer.address %>
        <%= current_customer.last_name %>
        <%= current_customer.first_name %><br><br>

        <%= f.radio_button :option, "1" %>
        <%= f.label '登録済みの住所から選択' %><br>
        <%= f.select :address_id, current_customer.addresses.map { |address| [address.postal_code + address.address + address.name, address.id] }, :include_blank => "選択してください" %><br><br>

        (略)

        <%= f.submit '確認画面へ進む', class: "btn btn-info" %>
        </div>

<% end %>

controllers/orders_controller.rb
class Public::OrdersController < ApplicationController
  def confirm
    @order = Order.new(order_params)
    if params[:order][:option] == '0'
     #省略
    elsif params[:order][:option] == '1'
     #省略
    end
  end

  private
  def order_params
    params.require(:order).permit(:postal_code,:address,:name,:payment_method,:shipping_cost,:total_payment,:status,:customer_id)
  end
end

option 컬럼은 order 테이블에 없고, 스트롱 파라미터에도 포함하지 않는 것이 좋은지, params[:order][:option] 와 같이 계층으로 해도 좋을지, 등 여러가지 의문에 생각하면서도 우선 입력해 「확인 화면으로 이동 버튼을 눌러 보았습니다.

결과



아래와 같이 Unpermitted parameters: :option 라고 나와 버립니다만, 우선 값이 들어간 option이 건네지고 있는 것을 알았습니다.
Processing by Public::OrdersController#confirm as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"省略", "order"=>{"option"=>"0"}, "commit"=>"確認画面へ進む"}
Unpermitted parameters: :option

아무래도, 이런 경우는 Unpermitted parameters 이 나와도 무시해도 좋은 것 같습니다. 상당히 놀랐습니다! 스트롱 파라미터에 option 컬럼은 없기 때문에 DB에 보존되지 않습니다만, @order 라고 하는 상자에 일시적으로 option 컬럼을 만들어, 거기에 값을 넣어 운반하고 있는 이미지인 것 같습니다. 이것이라면 params[:order][:option]와 같이 계층에서 꺼내는 것도 납득입니다. 아니 - 안쪽이 깊다.

좋은 웹페이지 즐겨찾기