我正在努力学习如何思考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;进行所有引用 - 但我在日志中获取相同的错误消息。