【问题标题】:No Route Matches - Devise User ID in Route没有路线匹配 - 在路线中设计用户 ID
【发布时间】:2015-10-16 10:54:32
【问题描述】:

我正在尝试将来自 Devise 的用户 ID 放在我的应用程序的路由中。例如 (www.test.com/users/1/offers)

我的应用程序运行良好,但尝试在没有“用户”的控制器中调用 redirect_to 时遇到路由匹配错误。

错误

没有路由匹配 {:action=>"index", :controller=>"offers", :user_id=>nil} 缺少必需的键:[:user_id]

welcome_controller.rb(不需要用户登录)

class WelcomeController < ApplicationController
  def index
    @skip_footer = true
    if user_signed_in?
        redirect_to user_offers_path(@user)
    else

    end
  end
end

routes.rb

 devise_for :users
 resources :users do
    resources :offers do
      member do
         put :tourcomplete
      end   
    end
  end

任何帮助都会很棒!

编辑

控制器

  def index
    if current_user.present?
      @offers = Offer.all
    else
      redirect_to root_url
    end

    def tourcomplete
      current_user.update_attributes(tourcomplete: true)
      redirect_to root_url
    end

    @featured_offers = Offer.where(featured: true)

  end

类别控制器

resources :categories, only: :show

【问题讨论】:

  • 如何获得@user 变量?
  • 发布 rake 路线会有帮助吗?

标签: ruby-on-rails ruby ruby-on-rails-4 devise


【解决方案1】:

首先,我必须指出,在这种情况下,您并没有调用 Devise 用户 ID,您只是在使用标准 Rails 资源路由:

#config/routes.rb
resources :users do
   resources :categories do #-> url.com/users/:user_id/categories
     get :test, on: :collection
   end
   resources :offers do #-> url.com/users/:user_id/offers
      put :tourcomplete #-> you don't need member do
   end
end

#app/controllers/offers_controller.rb
class OffersController < ApplicationController
   def index
      @user = User.find params[:user_id]
      @offers = @user.offers
   end
end

这就是您的代码应该使用的方式。


因此,如果您想将它与Welcome 控制器一起使用,您可以按如下方式使用它:

#app/controllers/welcome_controller.rb
class WelcomeController < ApplicationController
   def index
      redirect_to user_offers_path(current_user) if user_signed_in? 
   end
end

您的offers 控制器可以改进如下:

#app/controllers/offers_controller.rb
class OffersController < ApplicationController
   before_action :authenticate_user!

   def index
      @offers = Offer.all
   end
end

【讨论】:

  • 您好 Rich,感谢您的回答。我已将我的优惠控制器添加到问题中。这还能用吗?因为用户不拥有这些优惠。
  • 完美答案丰富。非常感谢!
  • 你介意我写一篇关于这个的博客文章并链接回这个问题吗?
  • 当然!如果你愿意,你也可以写一篇关于我的自定义错误页面 gem 的帖子 - github.com/richpeck/exception_handler :-p
  • 答案没问题,写代码比知道它是如何工作的更简单
【解决方案2】:

您可以在控制器中添加before_action,它将获取您需要的@user,以便能够重定向到user_offers_path(@user)

类似:

class WelcomeController < ApplicationController
  before_action :set_user, only: [:index]

  def index
    @skip_footer = true
    if user_signed_in?
        redirect_to user_offers_path(@user)
    else

    end
  end

  private

  def set_user
    @user = User.find(params[:user_id])
  end
end

当然,在调用 WelcomeController 的索引时,您还需要将 user_id 放入 GET 或 POST 参数中。

【讨论】:

  • 遗憾的是,此页面的索引不需要用户“登录”,因为它是登录页面。所以它永远不会用 user.find 找到任何东西?
  • 无需登录即可获取所有用户,但未登录无法获取“current_user”设计助手。
  • 如果用户未登录,您将无法使用redirect_to user_offers_path(@user),因为您无法从任何地方获取@user
  • Nelson Patricien Jimenez 是对的。你似乎需要的是来自 Devise 的 current_user 方法,如果用户没有连接,它不会给你任何东西。
  • 我仍然可以将用户重定向到该页面吗?如果他们已登录?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多