【问题标题】:schema.rb and mysql database issue in ruby on railsruby on rails 中的 schema.rb 和 mysql 数据库问题
【发布时间】:2013-06-25 20:18:36
【问题描述】:

首先,我已经学习 Rails 8 个月了,但感觉就像我昨天开始的一样,所以请多多包涵。我正在尝试解决为什么我的价值(称为可见)无法正常运行。我正在使用 Simple_form。 'visible' 是单选按钮的值:

 <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 始终对所有人可见。

我把&lt;%= @review.visible? %&gt; 写在评论表上。每次我刷新页面时它都是“真”,即使单选按钮可能是假的。我保存评论,@review.visible 然后进行相应的匹配。但随后我刷新,它又恢复了真实。

我认为问题可能是:

在我的 schema.rb 我有:

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

我删除了:default =&gt; true,没有任何改进,但我听说你不应该手动干预 schema.rb。

你认为 default => true 是导致问题的原因吗?做一个“迁移”是要走的路吗?在迁移中我该如何表述“默认 => true”部分?

最后,虽然我的 schema.rb 有“布尔值”,但我的实际数据库有 visible: tinyint(1) ,我认为这很可疑,但我在网上看到它们实际上是一回事,所以我不认为那是问题 - 如果您有不同的想法,请告诉我。

【问题讨论】:

    标签: mysql ruby-on-rails simple-form schema.rb


    【解决方案1】:

    你不应该接触 db/schema.rb。这是通过迁移和/或数据库状态自动更新的。您有正确的想法,您需要删除“可见”的默认值,但您需要在迁移中执行此操作。 change_column_default 可能是您想要的。

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

    此外,布尔值 vs tinyint(1) 也可以。这是 MySQL 的事情,因为 MySQL 没有真正的布尔类型。

    【讨论】:

    • 干杯,感谢您让我走上正轨。现在调查它。唯一的选择是默认 => false,因为布尔值必须是其中之一,对吧?
    【解决方案2】:

    为了回应 Phillip 所说,如果您需要更改数据库,您不应该通过 schema.rb 进行,您需要迁移。您应该在 mysql 上为布尔值设置一个默认值(因为否则它是三态而不是二进制(真、假、空)。

    如果你认为问题是默认错误,你可以做一个change_column迁移,你可以从命令行工具生成一个迁移:

    rails g migration UpdateTableName
    

    打开迁移文件(在models/db/migrate/timestamp_update_table_name.rb中)并将代码更改为:

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

    然后通过命令行工具运行:

    rake db:migrate
    

    如果您认为问题出在表单上,​​您可以随时查看 this 之类的内容,看看问题是否出在表单的值上。

    【讨论】:

    • 现在查看您的想法并在进行迁移之前获得正确的语法 - 不要把所有事情都搞砸!更改为'default => false' - 这不会给我同样的问题,除非我刷新时总是给我'false,而不是true?你提到三态。在迁移文件中,我实际上有 'null' 和 'true':add_column :reviews, :visible, :boolean, :null => true, :default => true.....这看起来对吗?
    • Re: this -> 更改为'default => false' - 这不会给我同样的问题,除非我刷新时总是给我'false,而不是true?默认情况下是的,但是如果您希望人们能够保存该字段(可见),他们将控制它是否可见,因此默认情况下它不可见。
    • Re: 你的语法,你不需要 :null => true 和 :default => true,如果你有一个默认值,你最终不会得到一个空值。如果你不想允许空值,你可以指定 :null => false。也许我错过了为什么你想要一个三态?您希望用户不设置它(null),将其设置为可见或不可见?
    • '默认情况下,是的,但是如果您希望人们能够保存该字段(可见),他们将控制它是否可见,因此默认情况下使其不可见。 '嗯,这就是问题所在!他们选择真或假单选按钮,总是相应地保存真假状态,但是当我这样做 我总是得到“真”(即使单选按钮被选择为假。我想我只需要尝试不同的迁移,看看有什么用。感谢您的帮助!
    • 听起来默认值不是您的问题,可能是您的视图代码没有保存正确的值。我没有在任何地方使用简单的形式,所以我不熟悉它的语法,但是在 github 上查看它,你可以这样做: 跨度>
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2011-06-22
    • 2015-01-11
    相关资源
    最近更新 更多