在用户成功注册后,我正在尝试将 Wicked-Gem 用于我的向导。
第一步是用户应该输入他的“一般信息”(简历和兴趣)。提交这些信息后,用户应该输入一个特征(一个用户有很多特征)。
我遇到的问题如下:如何正确使用 Wicked 为第一步的用户模型和第二步的特征模型(属于用户)创建表单?
我得到的错误是:
Can't mass-assign protected attributes: characteristics
我不想使用嵌套属性,因为向导将是我使用它们的唯一地方。
这是我的源代码:
邪恶的控制器:
#!/bin/env ruby
# encoding: utf-8
class AfterFirstSignInController < ApplicationController
include Wicked::Wizard
skip_before_filter :check_if_profile_complete, only: [:show, :update]
steps :general_infos, :characteristics
def show
@user = current_user
@characteristic = @user.characteristics.new
@title = t('controllers.after_first_sign_in_controller.show.title')
render_wizard
end
def update
@user = current_user
@characteristic = @user.characteristics.new
case step
when :general_infos
@user.attributes = params[:user]
render_wizard @user
else
@characteristic.attributes = params[:characteristic]
render_wizard @characteristic
end
end
end
“一般信息表格”
.container
.row
.span5.offset3
.progress.progress-info.progress-striped
.bar(style='width: 50%')
1/2
.page-header
%h1
= t('views.after_first_sign_in.general_infos.h1')
= form_for(@user, url: wizard_path, method: :put) do |f|
= render 'shared/error_messages', object: @user
.control-group
%label.control-label(for='bio')
= t('views.after_first_sign_in.general_infos.labels.bio')
.controls
= f.text_area :bio, id: 'bio', rows: '6'
.control-group
%label.control-label(for='interest_list')
= t('views.after_first_sign_in.general_infos.labels.interest_list')
.controls
= f.text_field :interest_list, id: 'interest_list'
.form-actions
= f.submit t('views.after_first_sign_in.general_infos.buttons.submit'), disable_with: t('views.after_first_sign_in.general_infos.buttons.submit'), class: 'btn btn-primary pull-right'
“特征形式”
.container
.row
.span5.offset3
.progress.progress-info.progress-striped
.bar(style='width: 100%')
2/2
.page-header
%h1
= t('views.after_first_sign_in.characteristics.h1')
= form_for([@user, @characteristic], url: wizard_path, method: :put) do |f|
= render 'shared/error_messages', object: @characteristic
= f.fields_for :characteristics do |builder|
.control-group
%label.control-label(for='title')
= t('views.after_first_sign_in.characteristics.labels.title')
.controls
= builder.text_field :title, id: 'title'
.control-group
%label.control-label(for='description')
= t('views.after_first_sign_in.characteristics.labels.description')
.controls
= builder.text_area :description, id: 'description', rows: '6'
.form-actions
= f.submit t('views.after_first_sign_in.characteristics.buttons.submit'), disable_with: t('views.after_first_sign_in.characteristics.buttons.submit'), class: 'btn btn-primary pull-right'
= link_to t('views.after_first_sign_in.characteristics.buttons.general_infos_step'), after_first_sign_in_path(:general_infos), class: 'btn'
路由文件
Test::Application.routes.draw do
scope '(:locale)' do
resources :users do
resources :characteristics
resources :followings, only: [:create, :destroy, :index]
resources :wall_entries, only: [:create, :destroy]
resources :messages, only: [:create, :destroy, :index]
end
resources :characteristics do
resources :votes, only: [:create, :destroy]
end
resources :after_first_sign_in
match '/auth/:provider/callback', to: 'sessions#create'
match '/auth/failure', to: redirect('/')
match '/sign_out', to: 'sessions#destroy', as: 'sign_out'
match '/change_locale', to: 'users#change_locale', as: 'change_locale'
match '/home', to: 'users#home', as: 'home'
match '/discover', to: 'users#discover', as: 'discover'
match '/terms_of_service', to: 'pages#terms_of_service'
match '/masthead', to: 'pages#masthead'
match '/privacy', to: 'pages#privacy'
root to: 'pages#index'
end
end
非常感谢!