2012-01-21 7 views
0

プロファイルの属性値を送信して変更するチェックボックスがいくつかあります。属性は、:default => trueのブール値として作成されました。このように設定した他のすべてのチェックボックスについては、属性の値はtrue/falseのいずれかです。ただし、この1つのチェックボックスはtrueまたはnilです。なぜdefault => trueのチェックボックスは、falseではなく他のオプションとしてnilになるのですか?

同じことを設定しても、どのように可能ですか?値をtrueまたはfalseに変更するだけでフォームが必要です。いいえ。誰か助けてくれますか? 。

class AddAccessItemsToProfiles < ActiveRecord::Migration 
    def self.up 
    add_column :profiles, :access_items, :boolean, :default => true 
    end 

    def self.down 
    remove_column :profiles, :access_items, :boolean, :default => nil 
    end 
end 

(私は上に行く前に、私はするself.downが:default => nilで気づくが、私は他のマイグレーションでは機能していることを持ってプラス:ここ

は私のプロファイルのテーブルに列を追加し、移行です私はそれが問題を起こすとは思わなかった)ここで

が値更新する私のコントローラのアクションです:フォームここ

def access_items_settings 
    if current_user.profile.update_attributes(:access_items => params[:access_items]) 
    redirect_to settings_path 
    else 
    redirect_to settings_path, :notice => 'Oops, something went wrong. Please try again.' 
    end 
end 

をされて私は提出:

<%= form_tag(access_items_settings_path, :method => :put) do %> 
    <p class="setting"><%= check_box_tag(:access_items, 1, @user.profile.access_items ? true : false) %> 
    &nbsp;This lets your items be accessed. 
    <br><span class="indentClarify">(Some details.)</span></br></p> 
<% end %> 

(私はspanp、余分なbrを削除し、それは何もしなかった。)

そして最後のjQuery:これは、データベースのデフォルト値とは何の関係もありません

$(function(){ 
    $(':checkbox').live('click',function() { 
     $(this).closest('form').submit(); 
    }); 
}); 

答えて

1

このチェックボックスをオフにすると、ブラウズで値がまったく送信されないため、params[:access_items]がnullで、これがデータベースに保存されます(カラムにはNULLが許可されるため)。レールcheck_boxヘルパー(と違って)は隠しフィールドを使用しているため、未チェックボックスも値を送信します。あなたは同じテクニックを使いたいかもしれません。

他のチェックボックスとは何が違うのか分かりませんので、コメントできません。

+0

ありがとうございました。 true/falseのみを許可するように列を設定する方法はありますか? – tvalent2

+2

はい:指定する:null =>列を追加するときはfalseです。既存のカラムを変更するための 'change_column_null'メソッドもあります。私はかなり多くの場合、常にブール値の列を設定しています –

+0

これは非常に役立ちます、もう一度ありがとうございます! – tvalent2

関連する問題