前几日再看《Rails Cookbook》时有一章叫‘Processing Dynamically Created Input Fields’处理动态创建的输入项(大概是这么翻译吧)觉得挺好可以在以后当作用户权限或角色设置来用。于是实际练了一下但发现一个错误
先把源码发一下,再把错误用有注释标出来
db/schema.rb:
mode 关系设置:
app/controllers/user_controller.rb
app/views/user/list_perms.rhtml
app/helpers/user_helper.rb:
附上一张图
先把源码发一下,再把错误用有注释标出来
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
附上一张图