【问题标题】:Couldn't find User with id=edit in rails tutorial chapter 9在 Rails 教程第 9 章中找不到 id=edit 的用户
【发布时间】:2013-12-27 17:34:47
【问题描述】:

我是 Rails 新手。我正在关注 Michael Hartl 的 railstutorial 书。在第 9 章中,当我尝试编辑用户配置文件时,它不起作用。 /user/4/edit 呈现编辑页面 但是,当我单击应该呈现编辑页面的用户配置文件中的设置时,它会被路由到 /user//edit 并显示以下错误:

ActiveRecord::RecordNotFound in UsersController#show 找不到 id=edit 的用户

我知道这将是一个小错误,但我无法弄清楚。所以提前感谢您的帮助。

这是我的文件

users_controller.rb

class UsersController < ApplicationController

def show
@user = User.find(params[:id])
end

def new
@user=User.new
end

def create 
@user = User.new(params[:user])
if @user.save
  sign_in @user
  flash[:success] = "Welcome!"
  redirect_to @user
else
  render 'new'
end
end

def edit
@user = User.find(params[:id])
end

def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
  flash[:success] = "Profile updated"
  sign_in @user
  redirect_to @user
else
 render 'edit'
end
end

end

_header.html.erb

<header class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<div class="container">
  <%= link_to "project",root_path, id: "logo" %>    
<nav>
  <ul class="nav pull-right">
    <li><%= link_to "Home",    root_path %></li>
    <li><%= link_to "Help",    help_path %></li>

        <% if signed_in? %>
          <li><%= link_to "Users", '#' %></li>
          <li id="fat-menu" class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">
              Account <b class="caret"></b>
            </a>
            <ul class="dropdown-menu">
              <li><%= link_to "Profile", user_path(current_user) %></li>
              <li><%= link_to "Settings", edit_user_path(@current_user) %></li>
              <li class="divider"></li>
              <li>
                <%= link_to "Sign out", signout_path, method: "delete" %>
              </li>
            </ul>
          </li>

    <% else %>
      <li><%= link_to "Sign in", signin_path%></li>
    <% end %>

  </ul>
</nav>
 </div>
</div>
</header>

sessions_helper.rb

module SessionsHelper

def sign_in(user)
  cookies.permanent[:remember_token] = user.remember_token
  self.current_user = user
end

def signed_in?
  !current_user.nil?
end

def current_user=(user)
  @current_user = user
end

def current_user
  @current_user ||= User.find_by_remember_token(cookies[:remember_token])
end

def sign_out
  self.current_user = nil
  cookies.delete(:remember_token)
end

end

edit.html.erb

<% provide(:title,'Edit user') %>
<h1>Update your profile</h1>

<div class="row">
  <div class="span6 offset3">

    <%= form_for (@user) do |f| %>
    <%= render 'shared/error_messages' %>
    <%= f.label :name %>
    <%= f.text_field :name %>

    <%= f.label :email %>
    <%= f.text_field :email %>

    <%= f.label :password %>
    <%= f.password_field :password %>

    <%= f.label :password_confirmation, "Confirm password" %>
    <%= f.password_field :password_confirmation %>

    <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>

  <% end %>

  <%= gravatar_for @user %>
  <a href="http://gravatar.com/emails" target="_blank"> Change </a>

  </div>
</div>

routes.rb

SampleApp::Application.routes.draw do

resources :users
resources :sessions, only: [:new, :create, :destroy]

root to: 'static_pages#home'

match '/signup',   to: 'users#new', via: [:get, :post]
match '/signin',   to: 'sessions#new', via: [:get]
match '/signout',  to: 'sessions#destroy', via: [:delete]

match '/help',    to: 'static_pages#help', via: [:get, :post]
match '/contact', to: 'static_pages#contact', via: [:get, :post]
match '/about',   to: 'static_pages#about', via: [:get, :post]
end

sessions_controller.rb

class SessionsController < ApplicationController

def new
end

def create
  user = User.find_by_email(params[:session][:email].downcase)
  if user && user.authenticate(params[:session][:password])
    sign_in user
    redirect_to user
  else
    flash.now[:error] = "Invalid email/password combination"
    render 'new'
  end
end

def destroy
  sign_out
  redirect_to root_path
end

end

【问题讨论】:

  • 您能否将收到的参数放入编辑操作中
  • 另外,查看您的日志以查看原始参数。例如:Processing SearchesController#index (for 127.0.0.1 at 2013-12-27 09:56:35) [GET] Parameters: {"search"=&gt;{"query"=&gt;"yo"}}
  • 在错误中,参数显示为 {"id" => "edit"}。这是在编辑操作中接收的参数吗?

标签: ruby-on-rails


【解决方案1】:

改变这个

<li><%= link_to "Settings", edit_user_path(@current_user) %></li>

到这里

<li><%= link_to "Settings", edit_user_path(current_user) %></li>

您只能在用于呈现标题的控制器方法中使用您有权访问的变量。您的show 控制器仅声明@user,而不是@current_user,因此当呈现标头时,创建的url 对于user_id 没有任何内容。如果使用current_user,则将调用来自SessionsHelpercurrent_user 方法,将返回当前用户,并且您的url 中应包含user_id

这里是 Hartl 教程示例应用程序的 github 帐户。能够通过它并将其与您自己的代码进行比较并找到您偏离的地方可能是一种好习惯。由于您尚未完成本教程,可能会有一些不同之处,但您已经走得足够远了,它应该几乎都是一样的:https://github.com/mhartl/sample_app

【讨论】:

  • 我也试过了。但现在也发生了同样的错误。该错误在用户控制器中突出显示为“显示”方法。这是错误行:@user = User.find(params[:id])。为什么没有将用户 ID 传递给 url?相反,它需要 id=edit。
  • 我不太明白你在说什么。
  • ActiveRecord::RecordNotFound in UsersController#show 找不到 id=edit 的用户 当我尝试访问编辑页面时仍然显示此错误
  • 听起来您的路线有问题。您的 routes.rb 文件看起来不错。你最近换了吗?如果您已更改它,则需要重新启动 rails 服务器以使更改生效。重启服务器,运行rake routes,确保只有一个路径指向users#edit,且路径为GET users/:id/edit
  • 是的,只有一条路。在标题中,当我单击“配置文件”时,它还说“找不到用户控制器的操作'索引'”。我认为问题出在 current_user 上。这 2 个链接包含 current_user。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多