2013-06-25 2 views
0

우선 8 개월 동안 레일스를 배웠지 만 어제부터 시작한 것 같아서 제발 참아주십시오. 내 값인 visible이 올바르게 작동하지 않는 이유를 해결하려고합니다. Simple_form을 사용하고 있습니다. - 그들이 그것을 '대중', 다른 사용자가 개인 경우, 그들 만이 그것을 볼 수 있습니다, 그것을 볼 수 있도록 경우schema.rb와 ruby에서 mysql 데이터베이스 문제

<div class='review-form'> 
     <%= simple_form_for(@review) do |f| %> 
    # input boxes for current_user to put text here 

    #'public' radio button, checked by default, class is for css 
    <%= f.radio_button :visible, "true" , :class => "share_button" %> 

    #'private' radio button, class is for css 
    <%= f.radio_button :visible, "false", :class => "keep_private_button" %> 

    #user can cancel 
    <%= link_to I18n.t('write_review.cancel_button'), landing_page, 
    :class => 'btn' %> 

    #user can submit 
    <%= f.button :submit, I18n.t('write_review.submit_button'), 
    :class => 'btn btn-primary' %> 

아이디어가 CURRENT_USER 리뷰를 쓰는 것입니다 : '볼'라디오 버튼 값입니다. 라디오 버튼이 정상적으로 작동합니다. 로그 아웃하면 다른 컴퓨터 등에서 앱을보고 라디오 버튼이 마지막으로 저장된 상태가됩니다. 문제는 현재 검토 인 @review가 라디오 버튼의 상태에 관계없이 모든 사람에게 항상 표시된다는 것입니다.

검토 양식에 <%= @review.visible? %>을 입력했습니다. 라디오 버튼이 거짓 일지라도 페이지를 새로 고칠 때마다 '참'입니다. 나는 리뷰를 저장하고 @ review.visible은 그에 따라 일치한다. 그러나 그때 나는 새롭게하고 진실로 돌아 간다. 내가 :default => true을 삭제하고 호전이 없었다

t.boolean "visible",         :default => true 

하지만 난 당신이 수동으로 방해 안돼요 듣고 내 schema.rb에서

내가 가진 :

나는 문제가 될 수 있다고 생각 어쨌든 schema.rb.

기본값 => true가 문제의 원인이라고 생각하십니까? '이주'를하는 것이 최선의 길일까요? 마이그레이션에서 '기본 => 참'이라고 어떻게 말합니까?

마지막으로 내 schema.rb에 '부울'이 있지만 실제 데이터베이스에 visible: tinyint(1)이 있는데, 나는 물고기 같다고 생각했지만 온라인으로 읽은 사실 그들은 사실 같은 것이므로 생각하지 않습니다. 문제 - 다르게 생각하면 알려주세요.

답변

2

db/schema.rb를 만져서는 안됩니다. 이는 마이 그 레이션 및/또는 데이터베이스 상태를 통해 자동으로 업데이트됩니다. 'visible'에 대한 기본값을 제거해야한다는 점에서 올바른 생각을 가지고 있지만 마이 그 레이션에서 수행해야합니다. change_column_default는 아마도 당신이 원하는 것이다.

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_column_default

또한 TINYINT VS 부울 (1) 괜찮다. MySQL은 진정한 부울 유형이 없기 때문에 MySQL의 일입니다.

+0

건배, 나를 바른 길로 인도 해줘서 고마워. 그것으로 지금보십시오. 단 하나의 대안은 기본값 => false를 갖는 것입니다. 부울은 하나 또는 다른 것이되어야합니다. 맞습니까? – CHarris

1

필립 (Phillip)이 데이터베이스를 변경해야 할 경우 스키마 (schema.rb)를 통해 변경하지 말아야한다는 메시지를 반영하려면 마이그레이션이 필요합니다. mysql에서 boolean 값의 기본값을 가져야한다. 그렇지 않으면 바이너리 (true, false, null) 대신 tri-state가된다.

기본값이 잘못되었다고 생각하면 change_column 마이그레이션을 수행 할 수있다.

rails g migration UpdateTableName 

열기 마이그레이션 파일 (/ DB/마이그레이션/timestamp_update_table_name 모델 : 명령 행 도구에서 마이그레이션을 생성 할 수 있습니다.RB)에서 코드를 변경가되게합니다 :

def change 
    update_column :table_name, :columnname, :boolean, :default => false 
end 

다음 명령 줄 도구를 통해이를 실행 : 당신이 당신의 문제는 형태로 생각한다면, 당신은 항상 볼 수 this 같은 것을 볼 수 있었다

rake db:migrate 

문제의 양식 값입니다.

+0

지금 당신의 아이디어를 살펴보고 이주를하기 전에 문법을 올바르게 익히십시오. 모든 것을 엉망으로 만들고 싶지는 않습니다! 'default => false'로 변경하면 실제로 새로 고침 할 때 항상 false를주는 것을 제외하고는 동일한 문제가 발생하지 않습니까? 당신은 3 중 상태를 언급합니다. 마이그레이션 파일에서 실제로 'null'및 'true'가 있습니다. add_column : 리뷰, : visible, : boolean, : null => true, : default => true .....이 모양이 맞습니까? – CHarris

+0

Re : this -> 'default => false'로 변경 - 이것이 항상 새로 고침 할 때 false를주는 것을 제외하고는 똑같은 문제를 일으키지 않겠습니까? 기본적으로 예. 그렇지만 사람들이 해당 필드를 볼 수있게하려면 (표시) 표시 여부를 제어하므로 기본적으로 표시되지 않습니다. – creativereason

+0

Re : 구문에 모두 필요하지 않습니다. null => true 및 : default => true, 기본값이 있으면 null로 끝나지 않습니다. null을 허용하지 않으려면 null => false를 지정하십시오. 어쩌면 당신이 왜 3자를 원하는지 모르겠다. 사용자가 설정하지 않거나 (null), 표시 또는 비공개로 설정하겠습니까? – creativereason

관련 문제