2016-03-22 12 views
1

私のアプリには3つの支払い方法を受け入れることができる販売者がいます。レコードを作成/編集するために私はPostgreSQLのフォームと配列フィールドに複数のチェックボックスを使用しています複数のチェックボックスの値は保存されますが、Railsフォームにはロードされません

面白いのは、作成と更新の両方で値を保存するとうまくいくということです。配列はチェックボックスの値に基づいて配列としてPGテーブルに保存されます。ただし、編集時に、編集フォームはデータベースから正しい値をロードしません。すべてのチェックボックスはチェックされず、PGテーブルの配列値は無視されます。すべてのチェックボックスがチェックされているので、マイグレーションでデフォルト値が設定されていても、同じことが作成されます。

ご協力いただければ幸いです。

= form_for @merchant, layout: :horizontal do |f| 
    = f.check_box :payment_accepted, { :multiple => true }, 'Credit Card', nil 
    = f.check_box :payment_accepted, { :multiple => true }, 'Paypal', nil 
    = f.check_box :payment_accepted, { :multiple => true }, 'Direct Deposit', nil 
    = f.submit 'Save Changes', :class => 'btn btn-primary' 

私のコントローラのコードは次のとおりです:

class MerchantsController < ApplicationController 
    load_and_authorize_resource 
    before_action :set_merchant, only: [:show, :edit, :update, :destroy] 

    respond_to :html, :json, :js 

    def index 
    @merchants = Merchant.all 
    end 

    def show 
    end 

    def new 
    @merchant = Merchant.new 
    end 

    def edit 
    end 

    def create 
    @merchant = Merchant.new(merchant_params) 
    @merchant.save 
    respond_with(@merchant) 
    end 

    def update 
    @merchant.update(merchant_params) 
    flash[:notice] = 'Merchant was successfully updated.' 
    respond_with(@merchant) 
    end 

    def destroy 
    @merchant.destroy 
    redirect_to merchants_url, notice: 'Merchant was successfully destroyed.' 
    end 

    private 
    def set_merchant 
     @merchant = Merchant.find(params[:id]) 
    end 

    def merchant_params 
     params.require(:merchant).permit(:name, :description, :notif_email, :category_id, :country_id, :costo_procesamiento, payment_accepted:[]) 
    end 
end 

そして、私の移行:

共有を作成および編集のための部分的な表示

class CreateMerchants < ActiveRecord::Migration 
    def change 
    create_table :merchants do |t| 
     t.string :name 
     t.text :description 
     t.text :default_terms 
     t.text :notif_email 
     t.boolean :visible, default: true 
     t.integer :category_id 
     t.integer :country_id 
     t.integer :costo_procesamiento, null:false, default: 0 
     t.string :payment_accepted, array: true, default: "['Credit Card','Paypal','Direct Deposit']" 
     t.references :country, index: true, foreign_key: true 
     t.timestamps null: false 
    end 
    end 
end 

答えて

1

チェックボックスが知っている間、これはあります複数の値がある場合、どちらがどちらであるかはわかりません(チェックされた値/チェックされていない値から外れることはできません)。

= f.check_box :payment_accepted, { :multiple => true, checked: @payments.include?('Credit Card')}, 'Credit Card', nil 
= f.check_box :payment_accepted, { :multiple => true, checked: @payments.include?('Paypal') }, 'Paypal', nil 
= f.check_box :payment_accepted, { :multiple => true, checked: @payments.include?('Direct Deposit') }, 'Direct Deposit', nil 

とあなたのコントローラで、追加します:彼らは、彼らがまたはチェックすべきではない必要があるときに知っているので、あなたのチェックボックスを変更し

def edit 
    @payments = @merchant.payment_accepted 
end 
+0

これは完全に働きました。私は十分にあなたに感謝できません! – Augusto

関連する問題