找不到“破坏”动作,但它在那里......奇怪的错误

Posted

技术标签:

【中文标题】找不到“破坏”动作,但它在那里......奇怪的错误【英文标题】:Can't find the the 'destroy' action, but it's there... weird error 【发布时间】:2011-07-21 20:07:27 【问题描述】:

我的应用似乎无法在我的 Sessions 控制器中找到“销毁”操作。很奇怪,因为它就在那里。

我有一个这样的链接:

<%= link_to "Logout", logout_path %>

我在routes.rb 中路由到我的销毁操作:

match '/logout' => "sessions#destroy", :as => "logout"

这是我的会话控制器中的“销毁”操作:

def destroy
  reset_session
  redirect_to videos_path
end

当我单击链接时,我的日志中出现此错误:

Started GET "/logout" for 127.0.0.1 at Thu Mar 24 02:58:36 -0700 2011

AbstractController::ActionNotFound (The action 'destroy' could not be found for SessionsController):

这是怎么回事?

更新:

这是我的 routes.rb 文件:

root :to => "videos#new"
resources :videos
resources :video_votes
resources :users
resource :session
match '/login' => "sessions#new", :as => "login"
match '/logout' => "sessions#destroy", :as => "logout"

SessionsController.instance_methods的输出:

[“protected_instance_variables”,“asset_path”,“hidden_​​actions?”,“with_warnings”,“inspect”,“content_type”,“new_polymorphic_url”,“authenticate_with_http_basic”,“new_user_path”,“details_for_lookup”,“allow_forgery_protection=”, "view_context"、"protected_instance_variables="、"asset_path="、"default_url_options"、"authenticate_with_http_token"、"id"、"content_type="、"assign_shortcuts"、"_routes"、"_save_fragment"、 “default_url_options=”,“hash_for_new_session_path”,“redirect_to_facebox”,“edit_video_path”,“_layout_conditions”,“enable_warnings”,“new_polymorphic_path”,“request_http_basic_authentication”,“hash_for_new_user_url”,“方法”,“append_view_path”,“request_http_token_authentication”, hash_for_logout_path", "hidden_​​actions", "_layout_conditions=", "send", "hash_for_edit_video_vote_path", "handler_for_rescue", "expire_action", "new_session_path", "hidden_​​actions=", "gem", "caching_allowed ?", "hash_for_edit_video_url", "asset_host ", "_renderers?", "to_json", "singleton_methods", "page_cache_extension", "authenticate", "new_user_url", "nil?", "asset_host=", "responder", "logout_path", "action_methods", "格式”,“prepend_view_path”,“edit_video_vote_path”,“_handle_method_missing”,“page_cache_extension =”,“_one_time_conditions_valid_16?”,“protect_against_forgery?”,“rescue_handlers”,“responder =”,“hash_for_new_session_url”,“断点”,“格式= "、"perform_caching"、"require_dependency"、"verify_authenticity_token"、"edit_video_url"、"to_yaml_properties"、"form_authenticity_token"、"rescue_handlers="、"with_options"、"protected_methods"、"silence_stderr"、"perform_caching="、"equal ?”、“可重复?”、“hash_for_logout_url”、“mimes_for_respond_to”、“hash_for_edit_video_vote_url”、“_render_option_json”、“record_key_for_dom_id”、“class_eval”、“append_info_to_payload”、“new_session_url”、“mimes_for_respond_to=”、“回调”、“响应者?”、“private_methods”、“silence_stream”、“hash_for_edit_user_path”、“send”、“ha sh_for_root_path”、“html_safe?”、“执行?”、“eql?”、“current_user”、“to_yaml”、“decode_b”、“logout_url”、“id”、“edit_video_vote_url”、“_render_option_js”、“verified_request?” 、“sanitize_dom_id”、“hash_for_video_path”、“_render_template”、“handle_unverified_request”、“instance_eval”、“render”、“edit_user_path”、“public_methods”、“cache_page”、“hash_for_root_url”、“respond_to”、“type”、“ _render_option_xml”、“hash_for_edit_session_path”、“action_has_layout?”、“hash_for_video_url”、“mimes_for_respond_to?”、“translate”、“instance_exec”、“hash_for_edit_user_url”、“抑制”、“instance_variables”、“空白?”、“hash_for_videos_path”、 “method_for_action”、“b64encode”、“class”、“_render_option_update”、“url_options”、“hash_for_video_vote_path”、“singleton_class”、“lookup_context”、“edit_session_path”、“reset_session”、“video_url”、“unloadable”、“instance_variable_get ", "encode64", "dispatch", "present?", "edit_user_url", "videos_path", "==", "hash_for_rails_info_properties_path", "presence", "h ead”、“_view_paths?”、“===”、“clone”、“session”、“fresh_when”、“video_vote_path”、“_normalize_options”、“config”、“find_template”、“view_context_class”、“response_body”、 “fragment_cache_key”、“hash_for_edit_session_url”、“form_authenticity_param”、“hash_for_video_votes_path”、“view_context_class=”、“logged_in?”、“调试器”、“instance_variable_set”、“response_body=”、“locale”、“authenticate_or_request_with_http_digest”、“_hash_for_user ,“=〜”,“_helper_methods”,“access_denied”,“hash_for_videos_url”,“创建”,“rails_info_properties_path”,“dup”,“cache_store”,“polymorphic_path”,“locale =”,“hash_for_video_vote_url”,“_helper_methods= "、"instrument_fragment_cache"、"edit_session_url"、"进程"、"cache_store="、"_renderers"、"object_id"、"video_votes_path"、"_process_action_callbacks"、"fragment_exist?"、"as_json"、"user_path"、"respond_to ?", "_renderers=", "expires_in", "stale?", "render_to_facebox", "read_fragment", "videos_url", "acts_like?", "allow_concurrency", "hash_for_ra ils_info_properties_url"、"template_exists?"、"send_action"、"returning"、"taint"、"expires_now"、"video_vote_url"、"t"、"assets_dir"、"view_paths"、"_helpers"、"allow_concurrency="、" params”、“redirect_to”、“middleware_stack”、“to_enum”、“hash_for_video_votes_url”、“assets_dir=”、“instance_variable_defined?”、“require_or_load”、“_prefix”、“_helpers=”、“params=”、“authenticate_with_http_digest” ,“hash_for_user_url”,“middleware_stack=”,“dom_class”,“write_fragment”,“new_video”,“retrieve_response_from_mimes”,“_layout_conditions?”,“rails_info_properties_url”,“to_param”,“hash_for_users_path”,“javascripts_dir”,“缓存” ,“root_url”,“扩展”,“新”,“enum_for”,“video_votes_url”,“javascripts_dir =”,“localize”,“request_http_digest_authentication”,“user_url”,“send_file”,“dom_id”,“污染?” ,“通知”,“hash_for_new_video_path”,“respond_with”,“env”,“to_query”,“load”,“consider_all_requests_local”,“untaint”,“users_path”,“render_to_string”,“try”,“env =”, “标题”,“hash_for _login_path"、"consider_all_requests_local="、"instance_of?"、"view_runtime"、"`"、"require_association"、"headers="、"hash_for_session_path"、"send_data"、"decode64"、"new_video_path"、"default_url_options?" , "view_runtime=", "_helpers?", "logger", "instance_values", "require", "hash_for_users_url", "freeze", "stylesheets_dir", "rescue_handlers?", "login_path", "logger=", " kind_of?”、“status”、“hash_for_new_video_vote_path”、“stylesheets_dir=”、“response”、“suppress_warnings”、“session_path”、“controller_name”、“hash_for_new_video_url”、“status=”、“controller_path”、“response=” ,“action_has_layout=”,“instance_variable_names”,“collect_mimes_from_class_level”,“users_url”,“l”,“edit_polymorphic_url”,“authenticate_or_request_with_http_basic”,“request_forgery_protection_token”,“render_to_body”,“run_callbacks”,“hash_for_login_url”,“video_path”, “is_a?”、“new_video_vote_path”、“方法”、“request_forgery_protection_token=”、“load_dependency”、“db_runtime”、“hash_for_session_url”、“t ap”,“冻结?”,“new_video_url”,“_helper_methods?”,“copy_instance_variables_from”,“url_for”,“alert”,“to_a”,“page_cache_directory”,“db_runtime=”,“flash”,“login_url”, “rescue_action”、“page_cache_directory=”、“_handle_render_options”、“polymorphic_url”、“hash_for_new_video_vote_url”、“display”、“expire_fragment”、“taguri”、“cleanup_view_runtime”、“session_url”、“close_facebox”、“location”、“ default_render"、"to_s"、"silence_warnings"、"taguri="、"helpers_path"、"request"、"edit_polymorphic_path"、"hash_for_new_user_path"、"action_name"、"_view_paths"、"location="、"hash"、" authenticate_or_request_with_http_token"、"initialize_template_class"、"helpers_path="、"request="、"new_video_vote_url"、"action_name="、"_view_paths="、"rescue_with_handler"、"require_library_or_gem"、"expire_page"、"to_yaml_style"、"middleware_stack? "、"redirect_from_facebox"、"root_path"、"allow_forgery_protection"、"hash_for_edit_video_path"]

这是我的整个 Sessions 控制器:

class SessionsController < ApplicationController

  def create
    if user = User.authenticate(params[:email], params[:password])
      session[:user_id] = user.id
      redirect_to videos_path
    else
      flash.now[:alert] = "Invalid login/password combination"
      render :action => 'new'
    end

    def destroy
      reset_session
      redirect_to videos_path
    end
  end
end

【问题讨论】:

你试过重启你的服务器吗?还要仔细检查您的销毁操作是否意外放入私有内部。我之前犯过几次这个错误 是的,我已经重启了,方法不是私有的... hmm wierd.... 看不出有什么问题 呵呵。当然。我会看看我能不能弄明白。 谢谢!如果您想查看更多代码,请告诉我。 【参考方案1】:

看起来我在我的 Sessions 控制器中弄乱了end 的位置,导致我的销毁方法不起作用...

我不得不将我的 Sessions 控制器更改为:

class SessionsController < ApplicationController

def create
  if user = User.authenticate(params[:email], params[:password])
    session[:user_id] = user.id
    redirect_to videos_path
  else
    flash.now[:alert] = "Invalid login/password combination"
    render :action => 'new'
  end
end

  def destroy
    reset_session
    redirect_to videos_path
  end
end

【讨论】:

【参考方案2】:

尝试改变这一行:

match '/logout' => "sessions#destroy", :as => "logout"

让它看起来像这样:

get '/logout' => "sessions#destroy", :as => "logout"

这是相同的路由,但它只会响应获取此特定操作的请求。

【讨论】:

它实际上是delete 方法(这是自然的post)但不是get【参考方案3】:

好的,我想我明白了

将 routes.rb 更改为

resources :sessions

【讨论】:

以上是关于找不到“破坏”动作,但它在那里......奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章

MainActivity 找不到 ID 为 android.R.id.list 的 ListView,但它在那里

Java EE - 找不到 ojdbc,尽管它在那里

SBT 在本地 maven 存储库中找不到文件,尽管它在那里

Firestore 找不到视频文件,但它在播放器中播放

RVM Ruby 1.9.1 安装找不到 zlib 但它的运行时和开发库在那里

weblogic在阶段找不到.ear,但它在文件系统上