我是铁轨上的红宝石的新手。我有一个具有这些属性的用户模型:登录,电子邮件,角色和组。
这是我的文件/app/models/user.rb
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# login :string(255)
# email :string(255)
# role :integer
# group :integer
# created_at :datetime
# updated_at :datetime
#
class User < ActiveRecord::Base
attr_accessible :login, :email, :role, :group
def self.search(search)
if search
where('login LIKE ?', "%#{search}%")
else
scoped
end
end
end
这是我的app / views / users / edit.html.erb
<%= form_for(@user) do |f| %>
<div class="field">
<%= f.label :login %><br />
<%= f.text_field :login, :readonly => true%>
</br>
<%= f.collection_select(:role, Role.all, :id, :name)
%>
</div>
<div class="actions">
<%= f.submit "Update" %>
</div>
<% end %>
当我点击“更新”按钮时,我会转到“用户显示”页面。 我有这个痕迹:
Started PUT "/users/4"
processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"HBB9IcKpWyjSbrmh6os=", "user"=>{"role"=>"3"}, "commit"=>"Update", "id"=>"4"}
Redirected to http%3A%2F%2F10.100.2.66%3A3000%2Fusers%2F4
Completed 302 Found in 1ms
这是我的app / controllers / users_controller.rb
class UsersController < ApplicationController
before_filter :require_admin
helper_method :sort_column, :sort_direction
def new
@title = "Sign up"
end
def show
@user = User.find(params[:id])
@title = "User"
end
def edit
@title = "Edit User"
@user = User.find(params[:id])
end
def index
@users = User.search(params[:search]).order(sort_column + " " + sort_direction).paginate(:page => params[:page],:per_page => 10)
end
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
flash[:success] = "Profile updated."
redirect_to @user
else
@title = "Edit user"
render 'edit'
end
end
def get
@user = User.find(params[:login])
end
我不明白为什么它不起作用。如果在索引中,我强制更新这样的用户,它正在工作:
def index
@testUser = User.find(6)
@test.user.update_attributes(:role => "2")
...
end
就像更新中的指令没有执行一样。如果我这样做:
def update
logger.info("i am in update)
...
end
我没有任何日志
这里是rake routes命令的结果:
我希望我很清楚。对不起我的英语,他非常糟糕。
感谢您的帮助。
答案 0 :(得分:0)
日志表明它确实已达到更新操作:
Started PUT "/users/4"
processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"HBB9IcKpWyjSbrmh6os=", "user"=>{"role"=>"3"}, "commit"=>"Update", "id"=>"4"}
Redirected to http://10.100.2.66:3000/users/4
Completed 302 Found in 1ms
第一行看起来像show动作,但请记住show动作是GET请求。作为“PUT”请求意味着它被路由到更新操作。正在运行rake routes
确认了这一点:
rake routes
PUT /users/:id(.:format) {:controller=>"users", :action=>"update"}
第2行进一步证实了这一点:processing by UsersController#update as HTML
告诉我们rails正在将UsersController的更新操作处理为HTML(例如,与JSON相反)。
在另一个主题上,我注意到您的User#role
属性具有误导性。您应该将其命名为role_id
,以表明它是与Role
相关联的整数,并更新您的代码:
# user.rb
attr_accessible :role_id
belongs_to :role
# app/views/users/edit.html.erb
<%= f.collection_select(:role_id, Role.all, :id, :name)
祝你好运!
答案 1 :(得分:0)
也许是因为错误的变量:
def index
@testUser = User.find(6)
@test.user.update_attributes(:role => "2")
...
end
必须是:
def index
@testUser = User.find(6)
@testUser.update_attributes(:role => "2")
...
end
也许你可以这样:
@testUser = User.find(6)
@testUser.role = 2
@testUser.save