无法使此控制器方法工作

时间:2013-07-13 16:02:37

标签: ruby-on-rails

我想通过链接点击将用户切换为管理员。我根据建议改变了代码,但它仍然没有用。

控制器:

def toggle_admin
    @user = User.find(params[:id])
    if @user.is_admin == true
      @user.is_admin = false
    else
      @user.is_admin = true
    end

    respond_to do |format|
      format.html { redirect_to @users }
    end
end

来自调用方法的视图中的Stement:

<td><%= link_to 'Toggle Admin', :controller => :users, :method => :toggle_admin, :id => user.id, data: { confirm: 'Toggle Admin?' } %></td>

路线:

match 'users/:id/toggle_admin' => 'user#toggle_admin'

有人看到我的错吗?感谢。

我认为我的路由可能是问题所在。查看日志如何仅显示所有用户的检索,然后显示与id匹配的用户:

Started GET "/users?data%5Bconfirm%5D=Toggle+Admin%3F&id=1&method=toggle_admin" for 127.0.0.1 at 2013-07-13 12:16:25 -0400
Processing by UsersController#index as HTML
  Parameters: {"data"=>{"confirm"=>"Toggle Admin?"}, "id"=>"1", "method"=>"toggle_admin"}
  User Load (36.6ms)  SELECT "users".* FROM "users" 
  User Load (71.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
  Rendered users/index.html.erb within layouts/application (78.2ms)

4 个答案:

答案 0 :(得分:1)

你需要做一个

@user.save

在那里的某个地方。

此外,整个if块可能会被

替换
@user.is_admin = !@user.is_admin

答案 1 :(得分:1)

尝试如下;

def toggle_admin
    @user = User.find(params[:id])
    if @user.is_admin == true
      @user.is_admin = false
    else
      @user.is_admin = true
    end

    @user.save

    respond_to do |format|
      format.html { redirect_to @users }
    end
end

或者您也可以使用update_attributes,如下所示

@user.update_attributes(is_admin: true)

答案 2 :(得分:1)

如果is_admin是布尔值,您可以使用toggle来完成此操作:

def toggle_admin
  @user = User.find(params[:id])
  @user.toggle :is_admin
  @user.save

  respond_to do |format|
    format.html { redirect_to @users }
  end
end

答案 3 :(得分:0)

我在控制器调用中有一个缺陷。它应该是:

<%= link_to 'Toggle Admin', { :controller => :users, :action => :toggle_admin, :id => user.id} %>