Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 切换模型中的单个值,所有值都从链接到_Ruby On Rails_Rest_Link To - Fatal编程技术网

Ruby on rails 切换模型中的单个值,所有值都从链接到

Ruby on rails 切换模型中的单个值,所有值都从链接到,ruby-on-rails,rest,link-to,Ruby On Rails,Rest,Link To,我有一个用于Rails 3应用程序页面的管理员控制器,该页面在一个表中列出了所有用户模型帐户,每行的一部分应该是一个链接(带有确认),用于切换我的用户模型的is_Admin属性。我希望通过允许管理员单击表格单元格中列出当前管理员状态的文本来实现这一点(即,单击“否”将设置为“管理员为真”) 现在,我对任何花哨的AJAX方法都不感兴趣,让我们忽略以下事实:从UI的角度来看,单击指示对象状态的文本以切换该状态不一定是最佳选择 我想知道的是,这可以在一个要调用的链接内完成,还是需要围绕它构建一个表单?

我有一个用于Rails 3应用程序页面的管理员控制器,该页面在一个表中列出了所有用户模型帐户,每行的一部分应该是一个链接(带有确认),用于切换我的用户模型的is_Admin属性。我希望通过允许管理员单击表格单元格中列出当前管理员状态的文本来实现这一点(即,单击“否”将设置为“管理员为真”)

现在,我对任何花哨的AJAX方法都不感兴趣,让我们忽略以下事实:从UI的角度来看,单击指示对象状态的文本以切换该状态不一定是最佳选择

我想知道的是,这可以在一个要调用的链接内完成,还是需要围绕它构建一个表单?我的管理控制器在routes.rb中定义为“resources:admin”,并且
rake routes
列出了一个PUT操作,该操作的命名路径为“admin”,调用admin#update方法

以下是到目前为止我得到的信息:

<%= link_to (user.is_admin ?  "Yes" : "No"), 
             admin_path(:user => {:id => user.id, :is_admin => !user.is_admin}), 
             {:confirm => "Are you sure?", :method => :put} %>
我不确定它为什么要调用destroy方法,它似乎是我列出的管理特定路由中的最后一个:

rake routes | grep admin
            site_admin        /admin(.:format)                {:controller=>"admin", :action=>"index"}
           admin_index GET    /admin(.:format)                {:action=>"index", :controller=>"admin"}
           admin_index POST   /admin(.:format)                {:action=>"create", :controller=>"admin"}
             new_admin GET    /admin/new(.:format)            {:action=>"new", :controller=>"admin"}
            edit_admin GET    /admin/:id/edit(.:format)       {:action=>"edit", :controller=>"admin"}
                 admin GET    /admin/:id(.:format)            {:action=>"show", :controller=>"admin"}
                 admin PUT    /admin/:id(.:format)            {:action=>"update", :controller=>"admin"}
                 admin DELETE /admin/:id(.:format)            {:action=>"destroy", :controller=>"admin"}
我认为可能我传递的方法错误,它默认为最后一个,但建议您可以将
:method=>
设置为
:confirm
,例如作为HTML选项

所以从根本上说,我的问题是,我是否应该能够通过link_发出一个RESTful的非GET呼叫,就像这样?我以为Rails会在幕后为我构建一个小型表单

更多源代码请参见。

使用以下内容:

div_for @user do
  link_to (@user.is_admin? ? "Yes" : "No"), [@user, :toggle], :confirm => ...
end
这条路线:

map.resources :users, :as => "admin", :member => { :toggle => :put }
以及该控制器方法:

class UsersController < ...
  def toggle
    @user = User.find params[:id], :lock => true
    @user.is_admin = !@user.is_admin?
    @user.save!
    if request.xhr?
      render :update {|page| page[@user].replace_html @user }
    else
      redirect_to @user
    end
  end
end
class UsersController<。。。
def开关
@user=user.find参数[:id],:lock=>true
@user.is_admin=@user.u是管理员吗?
@user.save!
如果是request.xhr?
呈现:更新{|页面|页面[@user]。替换_html@user}
其他的
将_重定向到@user
结束
结束
结束
试图通过一个指向更新操作的链接来处理这个问题对于一个案例来说太复杂了(正如您已经发现的,存在一些陷阱)。在本例中使用
link\u to\u remote
是一个更好的选择(以防万一我已经添加了ajax处理,以显示它不太花哨)。

使用以下方法:

div_for @user do
  link_to (@user.is_admin? ? "Yes" : "No"), [@user, :toggle], :confirm => ...
end
这条路线:

map.resources :users, :as => "admin", :member => { :toggle => :put }
以及该控制器方法:

class UsersController < ...
  def toggle
    @user = User.find params[:id], :lock => true
    @user.is_admin = !@user.is_admin?
    @user.save!
    if request.xhr?
      render :update {|page| page[@user].replace_html @user }
    else
      redirect_to @user
    end
  end
end
class UsersController<。。。
def开关
@user=user.find参数[:id],:lock=>true
@user.is_admin=@user.u是管理员吗?
@user.save!
如果是request.xhr?
呈现:更新{|页面|页面[@user]。替换_html@user}
其他的
将_重定向到@user
结束
结束
结束

试图通过一个指向更新操作的链接来处理这个问题对于一个案例来说太复杂了(正如您已经发现的,存在一些陷阱)。在本例中使用
link\u to\u remote
是一个更好的选择(以防万一我已经添加了ajax处理,以显示它不太花哨)。

谢谢@hurikhan77。我会在接下来的一两天内给这个打一针。谢谢@hurikhan77。我会在接下来的一两天内给这个打一针。