我的路由/资源和控制器出错了.
我在routes.rb中有以下内容:
# routes.rb
resources :users do
resource :schedule
end
Run Code Online (Sandbox Code Playgroud)
我在控制器/用户/内部设置了schedule_controller.rb,因为我认为它应该是:
class Users::ScheduleController < ApplicationController
# Controller methods here...
end
Run Code Online (Sandbox Code Playgroud)
运行rake:路线显示
user_schedule POST /users/:user_id/schedule(.:format) schedules#create
new_user_schedule GET /users/:user_id/schedule/new(.:format) schedules#new
edit_user_schedule GET /users/:user_id/schedule/edit(.:format) schedules#edit
GET /users/:user_id/schedule(.:format) schedules#show
PUT /users/:user_id/schedule(.:format) schedules#update
Run Code Online (Sandbox Code Playgroud)
但是,导航到/ users /:user_id/schedule会返回以下错误:
uninitialized constant SchedulesController
Run Code Online (Sandbox Code Playgroud)
我的问题可能是只什么想法是,就是有事情做与嵌套的资源或宣布一个单一的资源,我要去什么地方错了.
我正在使用帮手
new_user_schedule_path(current_user)
Run Code Online (Sandbox Code Playgroud)
链接到我的"新"视图时.
我在Rails应用程序中使用STI,为了不必为所有子类定义路由,我在每个子类中添加以下内容:
def self.model_name
Mapping.model_name
end
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,Mapping是父模型名称.例:
class UserMapping < Mapping; end
Run Code Online (Sandbox Code Playgroud)
必须将它放在每个子类中并不是很干,所以我正在寻找一种方法在父类中以某种方式设置它,以便从父类继承的每个类自动将模型名称设置为父模型名称.
也许甚至有更好的方法来克服由于与设置无关的STI引起的路由问题model_name- 我对建议持开放态度!
提前致谢!
我遇到了Omniauth身份验证和Rails 4的问题,我得到了一个Rails ActiveModel :: ForbiddenAttributesError.
我使用gem 'protected_attributes'如此强大的参数应该不是问题.
我的用户模型包含以下内容:
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_create do |user|
user.username = auth.info.email
user.email = auth.info.email
user.password = Devise.friendly_token[0,20]
user.name = auth.info.name
end
end
Run Code Online (Sandbox Code Playgroud)
user.password 在那里只是为了保持与现有的Devise auth系统的兼容性.
AR错误表示此行:where(auth.slice(:provider, :uid)).first_or_create do |user|抛出错误.
从以下方法调用上述方法:
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def mavenlink
@user = User.from_omniauth(request.env['omniauth.auth'])
service = @user.services.initialize_or_update_via_omniauth(request.env['omniauth.auth'])
if service && service.save
sign_in_and_redirect @user #this will throw if @user is not activated
set_flash_message(:notice, :success, :kind => "Mavenlink") if is_navigational_format?
else
redirect_to root_path, error: "Error signing in …Run Code Online (Sandbox Code Playgroud)