2013-06-25 2 views
0

Прежде всего, я изучаю Rails в течение 8 месяцев, но чувствую, что я начал вчера, поэтому, пожалуйста, несите меня. Я пытаюсь решить, почему моя ценность, называемая видимой, работает неправильно. Я использую Simple_form. «Видимым» является радио значение кнопки:schema.rb и проблема базы данных mysql в ruby ​​on rails

<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 затем соответствует соответственно. Но затем я обновляюсь, и он возвращается к истине.

Я думаю, что проблема может быть:

В моем schema.rb у меня есть:

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

Я удалил :default => true и не было никакого улучшения, но я слышал, что вы не должны вручную мешать schema.rb в любом случае.

Считаете ли вы, что default => true вызывает проблему? Будет ли «миграция» стать способом? Как я могу сказать, что в миграции используется параметр «default => true»?

Наконец, в то время как мой schema.rb имеет «boolean», моя фактическая база данных имеет visible: tinyint(1), что, по моему мнению, было подозрительным, но я читал онлайн, они на самом деле одно и то же, поэтому я не думаю, что это проблема - если вы думаете по-другому, дайте мне знать.

ответ

2

Вы не должны касаться db/schema.rb. Это автоматически обновляется через миграцию и/или состояние вашей базы данных. У вас есть правильная идея в том, что вам нужно удалить значение по умолчанию для «видимого», но вам нужно сделать это при миграции. change_column_default - это то, что вы хотите.

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

Кроме того, логический против TINYINT (1) в порядке. Это MySQL, поскольку MySQL не имеет истинных булевых типов.

+0

Приветствия, спасибо, что поставили меня на правильный путь. Взгляни сейчас. Единственная альтернатива, однако, состоит в том, чтобы иметь значение по умолчанию => false, поскольку логическое значение должно быть таким или другим, верно? – CHarris

1

Чтобы повторить то, что сказал Филипп, если вам нужно изменить свою базу данных, вам не следует делать это через schema.rb, вам нужна миграция. У вас должно быть значение по умолчанию для booleans на mysql (потому что иначе это три-состояние вместо двоичного (true, false, null).

Если вы считаете, что проблема по умолчанию неверна, вы можете выполнить переход change_column вы можете сгенерировать миграцию из инструментов командной строки:

rails g migration UpdateTableName 

Открыть файл миграции (в моделях/дб/мигрирует/timestamp_update_table_name.Р.Б.) и изменить код, чтобы быть:

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

затем запустить это с помощью инструментов командной строки:

rake db:migrate 

Если вы считаете, что ваша проблема заключается в форме, вы всегда можете посмотреть на что-то вроде this, чтобы увидеть если это значения для вашей формы, которые являются проблемой.

+0

Теперь вы просматриваете свои идеи и получаете синтаксис прямо перед выполнением миграции - не хотите все испортить! Переход на «default => false» - это не даст мне такую ​​же проблему, кроме как всегда давать мне «false, когда я обновляю, а не true? Вы упоминаете три-состояние. В файле миграции у меня есть «null» и «true»: add_column: reviews,: visible,: boolean,: null => true,: default => true ..... Правильно ли это выглядит? – CHarris

+0

Re: this -> Change to 'default => false' - это не даст мне ту же проблему, кроме всегда давая мне false при обновлении вместо true? По умолчанию да, но если вы хотите, чтобы люди могли сохранять это поле (видимое), они будут контролировать, видно ли это или нет, поэтому просто не видно по умолчанию. – creativereason

+0

Re: ваш синтаксис, вам не нужны оба: null => true и: default => true, если у вас есть значение по умолчанию, вы не получите нуль. Если вы хотите не разрешать nulls, вы должны указать: null => false. Может быть, мне не хватает, почему вы хотели бы получить три-государство? Вы хотите, чтобы пользователь либо не установил его (null), установил его как видимый или невидимый? – creativereason

 Смежные вопросы

  • Нет связанных вопросов^_^