【发布时间】:2016-01-14 04:03:28
【问题描述】:
我有一个用户模型和控制器。我正在尝试向我的控制器发出 put 和 delete 请求,其中 put 请求与 users#allow 相关联,并且假定删除请求被定向到 users#destroy。但是,当我提出请求时,我不断收到此错误:
No route matches [GET] "/users/1/allow"
我还在为用户和管理类使用设计,因此这可能与此错误有关。我不太确定。这是我的 routes.rb:
Rails.application.routes.draw do
get 'users/index'
put 'users/:id/allow', :to => 'users#allow', :as=>:users_allow
delete 'users/:id/destroy', :to => 'users#destroy',:as => :users_destroy
devise_for :users
devise_for :admins
root 'website#show'
resources :tweets do
put '/pass', :to => 'tweets#pass',:as => :pass
put '/fail', :to => 'tweets#fail',:as => :fail
end
get '/to_json', :to=>'tweets#to_json'
结束
这是我的用户控制器:
class UsersController < ApplicationController
before_action :find_user, only:[:allow,:destroy]
before_filter :authenticate_admin!
def index
@users = User.all
end
def allow
find_user.update(:edit_permission=>true)
redirect_to(:back)
end
def destroy
find_user.destroy
redirect_to(:back)
end
private
def find_user
@user = User.find(params[:user_id])
end
end
这是我从哪里调用的用户视图,users/index.html.erb:
<h1>Users#index</h1>
<p>Find me in app/views/users/index.html.erb</p>
<ul>
<% @users.each do |user|%>
<% if user.edit_permission == nil%>
<li style="color:red"> <%=link_to 'approve', users_allow_path(user), method: :put %> <%=link_to 'delete', users_destroy_path(user), method: :delete %><%= "#{user.name} #{user.email}"%> </li>
<% else%>
<li style="color:green"><%=link_to 'delete', users_destroy_path(user), method: :delete %><%= "#{user.name} #{user.email}"%> </li>
<% end%>
<%end%>
</ul>
我还想补充一点,当我进入视图并在浏览器中为 put 请求的链接执行检查元素时,我确实看到了:
<a rel="nofollow" data-method="put" href="/users/1/allow">approve</a>
【问题讨论】:
-
控制器中的
allow方法是否被执行(即数据库中的记录是否更新)或根本不执行?或者,在日志文件中,您是否看到在错误的 GET 操作之前处理了 PUT 操作,或者是否调用了 GET 操作来代替 PUT 操作?我想这可能是你的redirect_to(:back)在捉弄你。 -
确保您的应用中启用了 JavaScript,否则请求将退回到使用
GET -
听起来
jquery_ujs没有加载 -
Pavan 的评论听起来是对的。 Rails 依靠不显眼的 JS 来处理
data-method属性。否则,所有链接都会降级为 GET。
标签: ruby-on-rails ruby ruby-on-rails-4 devise routes