《Rails Cookbook》中的错误

本文尝试实现一个基于Rails的应用程序中的用户权限管理系统。通过定义用户、角色及权限三者间的关系,并利用数据库模型进行关联,实现了一个可以动态配置用户权限的功能。然而,在实际操作中遇到了一些问题,尤其是在更新权限时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几日再看《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> </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




附上一张图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值