【问题标题】:can't redirect_to current_user in ruby on rails无法在 ruby​​ on rails 中重定向到 current_user
【发布时间】:2014-11-13 16:24:07
【问题描述】:

我是 ruby​​ on rails 的新手,我试图更新我的用户,但是当我的用户更新时,我无法重定向到我的 current_user。这是我的控制器:

class WelcomeController < ApplicationController
  def index
    @users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id]))
  end

  def create
    user = User.login(params[:session][:username], params[:session][:pass])
    if user
      login user
      redirect_to root_url
    else
      redirect_to welcome_index_path
    end
  end

  def sucess
    @user = User.find(params[:id])
    @relation = Relation.new
  end

  def edit
    if current_user.update_attributes(:image => params[:image])
      logger.debug "image: #{current_user.image}"
      if current_user.changed?
        redirect_to current_user
      else
        render 'edit'
      end
    else
    end
  end

  def destroy
    logout
    redirect_to root_url
  end
end

我的路线

  get "uploads/new"

  get "micropost/new"

  get "user/new"
  get "user/saved"

  get "post/new"
  get "post/show"

  get "welcome/index"
  get "welcome/sucess"
  get "welcome/edit"
  get "welcome/test"
  root :to => "welcome#index"
  get '/users/:id', :to => 'welcome#sucess', :as => "user"  

  match '/relations', to: 'relation#create', via: 'post'
  match '/relations/:id', to: 'relation#destroy', via: 'delete'
  resources :users
  resources :relations,  only: [:create, :destroy]
  resources :microposts
  resources :uploads


  match '/welcome/edit', to: 'welcome#edit', via: 'post'
  match '/login', to: 'welcome#create', via: 'post'
  match '/logout' => 'welcome#destroy', as: :logout
  match '/create', to: 'micropost#create', via: 'post'
  match '/signup', to: 'user#signup', via: 'post'

当我检查日志文件时:

  Started POST "/welcome/edit?method=post" for 127.0.0.1 at 2014-11-13 15:09:00 +0700
Processing by WelcomeController#edit as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"XHQeEBjnndipJ8c4TrOnn5Yzh7xqvcEhl4+L7BbGBY0=", "image"=>"Hydrangeas.jpg", "commit"=>"Save", "method"=>"post"}
  [1m[35mUser Load (1.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
  [1m[36m (0.0ms)[0m  [1mbegin transaction[0m
  [1m[35mUser Exists (0.0ms)[0m  SELECT 1 AS one FROM "users" WHERE ("users"."username" = 'sa1234' AND "users"."id" != 10) LIMIT 1
  [1m[36m (1.0ms)[0m  [1mUPDATE "users" SET "image" = 'Hydrangeas.jpg', "updated_at" = '2014-11-13 08:09:00.576402' WHERE "users"."id" = 10[0m
  [1m[35m (157.0ms)[0m  commit transaction
  [1m[36mUser Load (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
image: Hydrangeas.jpg
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
  Rendered welcome/edit.html.erb within layouts/application (4.0ms)
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
Completed 200 OK in 219.0ms (Views: 52.0ms | ActiveRecord: 159.0ms)

如果我的 current_user 更新不成功,我不知道我的应用程序如何渲染编辑,拜托!帮我解决这个问题:)

更新: @Jakob S,这是我尝试您的代码时的日志:

Started GET "/welcome/edit" for 127.0.0.1 at 2014-11-13 15:21:57 +0700
Processing by WelcomeController#edit as HTML
  [1m[36mUser Load (1.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
  [1m[35m (0.0ms)[0m  begin transaction
  [1m[36mUser Exists (1.0ms)[0m  [1mSELECT 1 AS one FROM "users" WHERE ("users"."username" = 'sa1234' AND "users"."id" != 10) LIMIT 1[0m
  [1m[35m (0.0ms)[0m  commit transaction
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
image: 
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
Redirected to http://localhost:3000/users/10
Completed 302 Found in 5.0ms (ActiveRecord: 2.0ms)


Started GET "/users/10" for 127.0.0.1 at 2014-11-13 15:21:57 +0700
Processing by WelcomeController#sucess as HTML
  Parameters: {"id"=>"10"}
  [1m[36mUser Load (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", "10"]]
  [1m[35mUser Load (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
  [1m[35mUser Load (0.0ms)[0m  SELECT "users".* FROM "users" INNER JOIN "relations" ON "users"."id" = "relations"."following_id" WHERE "relations"."follower_id" = 10
  [1m[36mUser Load (0.0ms)[0m  [1mSELECT "users".* FROM "users" INNER JOIN "relations" ON "users"."id" = "relations"."follower_id" WHERE "relations"."following_id" = 10[0m
  Rendered welcome/sucess.html.erb within layouts/application (7.0ms)
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
  [1m[36mCACHE (0.0ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1[0m  [["id", 10]]
  [1m[35mCACHE (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
Completed 200 OK in 39.0ms (Views: 37.0ms | ActiveRecord: 0.0ms)

【问题讨论】:

  • 请。发布您的控制器和 routes.rb 的完整代码。
  • 我编辑了我的问题,请看
  • 请发布相关操作的完整日志。 image: Desert.jpg 行上方必须有相关输出。
  • 我发布了我的日志文件,请查看

标签: ruby-on-rails ruby


【解决方案1】:

current_user.changed? 引起了您的问题。

changed? 是 Rails 的Dirty model checking 的一部分。保存模型时会重置模型的脏状态(即更改了哪些属性)。

update_attributesupdates all attributes and saves the object。因此,current_user.changed? 将始终紧跟在update_attributes 之后的false,因为自上次保存后模型尚未更改。

删除changed? 及其相关render "edit" 部分的检查,你应该很高兴:

def edit
  if current_user.update_attributes(:image => params[:image])
    redirect_to current_user
  else
    render 'edit'
  end
end

额外提示:一般而言,像您正在实施的操作(更新资源的操作)通常会出现在 update 操作中。 edit 动作通常用于渲染 UI 以更改资源。

【讨论】:

  • 我什至无法进入我的编辑页面。我用你的代码发布了我的日志,请看!
  • 粗略看了一下日志,确实可以进入编辑页面,并且它实际上重定向到当前用户。据我所知,一切正常。如果您还有其他问题和疑问,请随时发布另一个问题,其中包含重现此新问题所需的详细信息。我很乐意尝试在那里回答,但在这个问题上这样做会变得太混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多