我使用 Devise gem 进行user
登录、允许:email
和:password
Wicked gemprofile
完成、允许first_name
、、、和。User 模型和Profile 模型。for Profile 在views/devise/registrations/new.html.erb 中设置为隐藏字段。我将对此问题进行解释,然后列出相关代码。last_name
username
bio
has_one :profile
accepts_nested_attributes_for :profile
belongs_to :user
user_id
我一遍又一遍地浏览了设计和邪恶的文档,但我无法弄清楚这个问题。我的 Wicked 控制器是 after_signup_controller。我插入binding.pry
after_signup#show 并看到通过注册过程并没有击中该控制器/动作。似乎注册后,Wicked Wizard 被跳过了。我将“/after_signup/name”(名称是我在 Wicked 中的第一步)附加到 localhost URL,在 after_signup#show 中使用 binding.pry,并看到 Wicked 完成了我的所有步骤。这使我认为某些东西正在覆盖通往向导的路线。
有没有人尝试过像这样使用 Devise 和 Wicked?如果您能看到为什么 Wicked 的路线在注册后被覆盖,请告诉我。
Rails.application.routes.draw do
resources :profiles
resources :posts
devise_for :users, controller: {
confirmations: 'users/confirmations',
# omniauth_callbacks: 'users/omniauth_callbacks'
passwords: 'users/passwords',
registrations: 'users/registrations',
sessions: 'users/sessions',
unlocks: 'users/unlocks'
}
#Wicked Wizard
resources :after_signup
root 'posts#welcome_page'
end
class Users::RegistrationsController < Devise::RegistrationsController
def new
super
end
def create
super
end
protected
def after_sign_up_path_for(resource)
'/after_signup'
end
end
class AfterSignupController < ApplicationController
include Wicked::Wizard
steps :name, :username, :bio, :image
def show
binding.pry
@profile = current_user.profile
render_wizard(@profile)
end
def update
@profile = current_user.profile
@profile.update(profile_params)
render_wizard(@profile)
end
private
def profile_params
params.require(:profile).permit(:username, :first_name, :last_name, :bio, :image, :user_id)
end
end
class ApplicationController < ActionController::Base
before_filter :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, profile_attributes: [:user_id, :first_name, :last_name, :username, :bio, :image])}
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, profile_attributes: [:user_id, :first_name, :last_name, :username, :bio, :image])}
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
end
end
##name.html.erb
<%= bootstrap_form_for(@profile, url: wizard_path, method: :put) do |f| %>
<div class="row">
<div class="field col-xs-8 col-sm-6">
<div class="field">
<%= f.text_area :first_name, autofocus: true %>
<%= f.text_area :last_name, autofocus: true %>
</div>
</div>
</div>
<% end %>
<div class="actions">
<%= f.submit "Next", :class => 'btn btn-primary' %>
or <%= link_to "skip", next_wizard_path %>
</div>
##username.html.erb
<%= bootstrap_form_for(@profile, url: wizard_path, method: :put) do |f| %>
<div class="row">
<div class="field col-xs-8 col-sm-6">
<div class="field">
<%= f.text_area :username, :placeholder => 'username' autofocus: true %>
</div>
</div>
</div>
<% end %>
<div class="actions">
<%= f.submit "Next", :class => 'btn btn-primary' %>
or <%= link_to "skip", next_wizard_path %>
</div>
##bio.html.erb
<%= bootstrap_form_for(@profile, url: wizard_path, method: :put) do |f| %>
<div class="row">
<div class="field col-xs-8 col-sm-6">
<div class="field">
<%= f.text_area :bio, autofocus: true %>
</div>
</div>
</div>
<% end %>
<div class="actions">
<%= f.submit "Next", :class => 'btn btn-primary' %>
or <%= link_to "skip", next_wizard_path %>
</div>
##image.html.erb
<%= bootstrap_form_for(@profile, url: wizard_path, method: :put) do |f| %>
<div class="row">
<div class="field col-xs-8 col-sm-6">
<div class="field">
<%= f.text_field :image, autofocus: true %>
</div>
</div>
</div>
<% end %>
<div class="actions">
<%= f.submit "Submit", :class => 'btn btn-primary' %>
</div>
这是我第一次向 Stack Overflow 发布问题。除了解决这个问题,如果我列出了太多文件,请告诉我。