`
tes
  • 浏览: 7700 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

《Rails Cookbook》中的错误

阅读更多
前几日再看《Rails Cookbook》时有一章叫‘Processing Dynamically Created Input Fields’处理动态创建的输入项(大概是这么翻译吧)觉得挺好可以在以后当作用户权限或角色设置来用。于是实际练了一下但发现一个错误
先把源码发一下,再把错误用有注释标出来
db/schema.rb:


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

  create_table "roles", :force => true do |t|
    t.column "name",    :string,  :limit => 80
  end

  create_table "users", :force => true do |t|
    t.column "login",   :string,  :limit => 80
  end

  create_table "permissions", :id => false, :force => true do |t|
    t.column "role_id", :integer, :default => 0, :null => false
    t.column "user_id", :integer, :default => 0, :null => false
  end
end



mode 关系设置:
class Role < ActiveRecord::Base
  has_many :permissions, :dependent => true 
  has_many :users, :through => :permissions
end

class User < ActiveRecord::Base
  has_many :permissions, :dependent => true 
  has_many :roles, :through => :permissions
end

class Permission < ActiveRecord::Base
  belongs_to :role
  belongs_to :user
end




app/controllers/user_controller.rb
class UserController < ApplicationController

  def list_perms
    @users = User.find(:all, :order => "login")
    @roles = Role.find(:all, :order => "name") 
  end

  def update_perms
    Permission.transaction do
      Permission.delete_all
      for user in User.find(:all)
        for role in Role.find(:all)
          if params[:perm]["#{user.id}-#{role.id}"] == "on" 
            Permission.create(:user_id => user.id, :role_id => role.id)
          end     
        end     
      end     
    end
    flash[:notice] = "Permissions Updated."
    redirect_to :action => "list_perms"
  end
end




app/views/user/list_perms.rhtml
<h2>Administer Permissions</h2>

<% if flash[:notice] -%>
  <p style="color: red;"><%= flash[:notice] %></p>
<% end %>

<% form_tag :action => "update_perms" do %>
<table style="background: #ccc;">
  <tr>
    <th>&nbsp;</th>
    <% for user in @users %>
      <th><%= user.login %></th> 
    <% end %>
  </tr>

<% for role in @roles %>
  <tr style="background: <%= cycle("#ffc","white") %>;">
    <td align="right"><strong><%= role.name %></strong></td>

    <% for user in @users %>
      <td align="center">
        <%#注意这里get_perm()方法的参数顺序%>
        <%= get_perm(user.id, role.id) %>
      </td>   
    <% end %>

<% end %>
</table>
<br />
<%= submit_tag "Save Changes" %>
<% end %>




app/helpers/user_helper.rb:




module UserHelper
  #注意这里get_perm()方法的参数顺序,发现错误了吧 结果是能够正常显示单更新时候出现异常

  def get_perm(role_id, user_id)
    name = "perm[#{user_id}-#{role_id}]"
    perm = Permission.find_by_role_id_and_user_id(role_id, user_id)
    color = "#f66"
    unless perm.nil?
      color = "#9f9"
      checked = 'checked=\"checked\"'
    end
    return "<span style=\"background: #{color};\"><input name=\"#{name}\" 
                  type=\"checkbox\" #{checked}></span>"
  end  
end




附上一张图
  • 描述: xiaoguo
  • 大小: 11.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics