新手问题 自学 Rails 过程中遇到了 Unknown key: admin 问题

hoowolf · 2013年01月13日 · 最后由 zhangxun 回复于 2013年01月14日 · 3900 次阅读

自己周末在自学 Rails 开发,遇到了一个问题,特此请教大家。首先,问题情景是:我想在后台修改用户的权限,具体是 admin 字段,但是 form 中更改后出了问题。

我建的 User 表如下:

# == Schema Information
#
# Table name: users
#
#  id              :integer         not null, primary key
#  name            :string(255)
#  email           :string(255)
#  created_at      :datetime        not null
#  updated_at      :datetime        not null
#  password_digest :string(255)
#  remember_token  :string(255)
#  admin           :boolean         default(FALSE)
#

class User < ActiveRecord::Base

  attr_accessor :current_password
  attr_accessible :email, :name, :password, :password_confirmation, :current_password
  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensetive: false }
  validates :password, presence: true, length: { minimum: 6 }
  validates :password_confirmation, presence: true

  private

    def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
    end
end

views 部分如下

<%= form_for([:manage, user]) do |f| %> 

              <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h4>权限修改</h4>
              </div>

              <div class="modal-body">
                <label>当前权限:</label>

                <%= f.select :admin, options_for_select([['管理员', true], ['用户', false]], user.admin) %>
              </div>
              <div class="modal-footer">
                <a class="btn btn-primary" data-dismiss="modal" aria-hidden="true">取消</a>
                <%= f.submit "保存", class: "btn btn-primary", 'data-disable-with' =>"正在保存" %>
              </div>

              <% end %>   

controller 部分如下:

class Manage::UsersController < Manage::ApplicationController

  def index
    @users = User.order(:id).page(params[:page])
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "用户已被成功删除!"
    redirect_to manage_users_url
  end

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

    if @user.update_attributes(params[:user])
      flash[:success]="修改成功!"
      redirect_to manage_users_url
    else
      redirect_to manage_users_url
    end
  end

end

我实际测试时,点击 “保存” 后页面提示错误,具体如下所示:

ArgumentError in Manage::UsersController#update

Unknown key: admin
Rails.root: /Users/huyipeng/Projects/cloud/xinyi

Application Trace | Framework Trace | Full Trace
app/controllers/manage/users_controller.rb:16:in `update'
Request

Parameters:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"5eOB401SeJ4/T+EIfzYl5uG95rT4JhHCqIl5+ccpzgU=",
 "user"=>{"admin"=>"true"},
 "commit"=>"保存",
 "id"=>"92"}
Show session dump

Show env dump

Response

Headers:

None

对于 admin 字段为什么会提示我说 unknown?是哪部分出现错误了吗?

1 看看 users 表是不是真的有 admin 字段了

2 因为 attr_accessible 没有 admin,我觉得应该会抛 mass-assignment 错误。

#1 楼 @Rei 非常感谢第一时间的回应。

ActiveRecord::Schema.define(:version => 20130106162542) do

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",                         :null => false
    t.datetime "updated_at",                         :null => false
    t.string   "password_digest"
    t.string   "remember_token"
    t.boolean  "admin",           :default => false
  end

  add_index "users", ["email"], :name => "index_users_on_email", :unique => true
  add_index "users", ["remember_token"], :name => "index_users_on_remember_token"

end

所以 admin 字段肯定是有了,对于 attr_accessible,我也尝试过,实际测试时仍然会报 ArgumentError in Manage::UsersController#update

#2 楼 @hoowolf 想问下你是如何在 Heroku 部署 Ruby-China 项目的? 我部署后总是提示 Application Error 查看 LOGS 也没有发现错误 希望与你交流

#3 楼 @460411234 不好意思,我没有部署 ruby-china 的代码,我主要是根据 rails tutorial 做简单的一些东西,ruby-china 里的一些 gem 我觉得太高级,比如登录这些,我还是想自己先实现一个登录功能

@user = User.find(params[:user]) 改成 @user = User.find(params[:id])

#5 楼 @lolychee 恩,是的,修改后, attr_accessible 添加以下:admin 就可以了

#7 楼 @460411234 这真心不是我部署的

attr_accessible 这一行去掉也可以的吧。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册