1

我正在使用 Rails 3.2.8 和 SQLite 1.3.6

我在更改数据库中的布尔变量时遇到了麻烦

SQLite 将“t”和“f”翻译为真假

此函数不会更新:approved属性(默认为 false)

def activate
  @user = User.find(params[:id])

  if @user.update_attribute(:approved, 't')

    redirect_to "/" #this is the return i get so the update returns true

  else
   render "/users?approved=false"
  end 
end

但是更改字符串之类@user.update_attribute(:email,'root@email.org')的会更新电子邮件

我该如何解决这个问题我需要某种 sqlite 适配器吗?

我已经安装了activerecord-jdbcsqlite3-adapter,它弄乱了我的应用程序,因为我太仓促了,没有注意到它已被弃用:P

我发现了这个线程:Rails 3 SQLite3 Boolean false ,但我不明白我需要做什么才能使 Rails 和 SQLite 正确通信,因为我是 Rails 中的新手 :)

我还认为值得一提的是,我在 Windows 7 x64 上运行它

更新

显然 Rails 确实知道如何与 Sqlite 通信,但我不知道为什么我的代码对布尔值无效,哈哈

在我看来,我有:

<% @users.each do |user| %> 
<tr> 
  <td><%= user.id %></td> 
  <td><%= user.email %></td>
  <td><%= user.approved? %></td>
  <td>
<% if !user.approved? %>
  <%= link_to 'Approve', active_user_path(user), :method => :put %> 
    <% end %> </td> 
</tr> 
<% end %> 

这列出了所有未经批准的用户和激活它们的链接(将 bool 设置为 true)

在我的控制器中我有

    def activate
      @user = User.find(params[:id])

    if @user.update_attribute(:approved, true)

      redirect_to "/" #this is the return i get so the update returns true

    else
      render "/users?approved=false" #this is not rendered
    end 
  end

和我的路线

match "users/:id/activate" => "users#activate", :as => "active_user"

这适用于其他字符串,如用户名、地址等,但不适用于布尔值

4

2 回答 2

1

如果approved@user 上的列是布尔值,您应该只传递 true/false 并让数据库适配器弄清楚。

@user.update_attribute(:approved, true)
于 2012-11-03T20:41:59.130 回答
0

我通过使用整数迁移到我的用户表解决了这个问题,我不知道为什么@user.update_attribute(:approved, true)不保存到数据库,它一定与我的设置有关

我进行了迁移add_column :users, :is_approved, :integer, :default => 0,当我想激活用户时,我只需将整数值翻转为 1

于 2012-11-06T12:14:14.550 回答