Rails 5 - 嵌套路由的路径 - 服务类

时间:2016-11-17 03:50:33

标签: ruby-on-rails ruby service path nested-routes

我正在努力学习如何思考rails预期的方式。这是一个4年多的奋斗,我仍然不在那里。

我已经多次询问过这个问题的变化,而且我仍然无法破译我在编写路径时可以用来思考的原则。

我有用户和设置的模型。协会是:

用户

has_one :setting, dependent: :destroy

设置

belongs_to :user

我的路线是:

resources :users, shallow: true do
    scope module: :users do
      resources :settings 
    end

我的设置控制器和视图嵌套在名为' users'。

的文件夹中

我正在尝试添加链接到我的设置展示页面的导航栏。

我尝试了20多种不同的变体,其中绝大多数都是猜测。我觉得应该没什么用。

当我耙路线时,我可以看到:

users/settings#show  PATCH    /settings/:id(.:format) 

我理解这意味着我应该能够写下:

 users_settings_path(@current_user.settings)

我不能。

我试过了:

<%= link_to "Settings", [@current_user, settings_path] %>

我也试过了其中的每一个:

users_settings_path(@current_user.setting)
users_settings_path(@settings)
users_settings_path(setting_url)
users_settings_path(setting_id)
users_setting_path [@current_user, setting_path] 
[@current_user, setting]
[@current_user, settings] 
[@current_user.settings, settings] 
[@current_user.setting, setting]
[@current_user.settings, settings]

在每种情况下,我都会收到错误消息:

undefined method `setting' for nil:NilClass

我认为此错误消息表示用户没有设置。但是,该错误消息没有任何意义,因为我在我的用户注册控制器中添加了一行说:

class Users::RegistrationsController < Devise::RegistrationsController

  def create
    super do |user|
      if user.persisted?
        User::CompleteRegistrationService.call(user: user)
      end
    end
  end

然后我有一个服务类:

class User::CompleteRegistration < ActiveRecord::Base

    def self.call(user: u)
      new(user: user).call
    end

    def initialize(user: u)
      self.user = user
    end

    def call
      Setting::SetupService.call(user: user)
    end


    private

    attr_accessor :user
end

然后我有:

class Setting::SetupService < ActiveRecord::Base

    def self.call(user: u)
      new(user: user).call
    end

    def initialize(user: u)
      self.user = user
    end

    def call
      setting = Setting.create!(user: user)
      # Dashboard.create(profile: profile)
    end

    private

    attr_accessor :user
end

因此,我希望在创建用户时,此服务类可以创建设置。

我无法弄清楚我是否错误地在导航条中写了这个链接(我已经尝试了至少30种不同的猜测 - 所以我不希望我没有绊倒跨越正确的形式),或者我的服务类在创建用户时不能创建设置。

任何人都可以看到我出错的地方吗?

我可以在我的控制台中看到我有一个用户,但我似乎没有任何设置实例:

Setting.first
  Setting Load (5.2ms)  SELECT  "settings".* FROM "settings" ORDER BY "settings"."id" ASC LIMIT $1  [["LIMIT", 1]]
 => nil 

我的日志显示我的注册控制器中的服务类方法出错。

日志说:

NameError - uninitialized constant User::CompleteRegistrationService:
  app/controllers/users/registrations_controller.rb:9:in `block in create'
  devise (4.2.0) app/controllers/devise/registrations_controller.rb:18:in `create'
  app/controllers/users/registrations_controller.rb:7:in `create'

问题在于我不了解如何理解日志。未初始化的常量意味着用户尚未初始化。这不可能是因为用户已经持久化到数据库(因此错误消息没有任何意义)。

任何人都可以看到我迷路的地方吗?

我尝试将User :: CompleteRegistration重命名为Users :: CompleteRegistrations(并且在服务类和注册控制器中对&#39; User&#39;用户&#39;进行所有引用 - 但我在日志中获取相同的错误消息。

0 个答案:

没有答案