Ruby on rails 4 使用Desive和wicked时无法保存用户注册信息

Ruby on rails 4 使用Desive和wicked时无法保存用户注册信息,ruby-on-rails-4,devise,wicked-gem,Ruby On Rails 4,Devise,Wicked Gem,我是rails平台的新手…我在表单中单击register时遇到了保存用户注册信息的问题…我没有收到任何错误,但在检查rails控制台时,所有用户信息都等于零…我不明白为什么。 我的用户步骤控制器代码 class UserStepsController < ApplicationController include Wicked::Wizard steps :finishing_step def show @user = current_user render_wizard end

我是rails平台的新手…我在表单中单击register时遇到了保存用户注册信息的问题…我没有收到任何错误,但在检查rails控制台时,所有用户信息都等于零…我不明白为什么。 我的用户步骤控制器代码

class UserStepsController < ApplicationController
include Wicked::Wizard
 steps :finishing_step

def show
 @user = current_user
  render_wizard
end

def update
  @user = current_user
  if @user.save
   redirect_to root_path
  else
    render_wizard
  end
end

def user_params
  params.require(:user).permit(:first_name, :middle_name, :last_name, :address_first_line, :address_second_line, :city, :nationality)
end

private

def redirect_to_finish_wizard
  redirect_to root_path, notice: "Thanks for signing up."
end
end
下面是用户控制器的代码

class UsersController < ApplicationController
def create
@user = User.new(params[:user])
      if @user.save
        redirect_to root_path
      else
        render_wizard
      end
    end
  end
下面是带有用户注册信息的简单表单的代码

<%= form_for User.new, url: wizard_path do |f| %>
<div><%= f.label :first_name, "First Name" %><br />
    <%= f.text_field :first_name %></div>
  <div><%= f.label :middle_name, "Middle Name" %><br />
    <%= f.text_field :middle_name %></div>
  <div><%= f.label :last_name, "Last Name" %><br />
    <%= f.text_field :last_name %></div>
  <div><%= f.label :phone_number, "Phone Number" %><br />
    <%= f.text_field :phone_number %></div>
  <div><%= f.label :date_of_birth, "Date of Birth" %><br />
    <%= f.date_select :date_of_birth, start_year: 1900 %></div>
  <div><%= f.label :address_first_line, "Address (first line)" %><br />
    <%= f.text_field :address_first_line %></div>
  <div><%= f.label :address_second_line, "Address (second line)" %><br />
    <%= f.text_field :address_second_line %></div>
  <div><%= f.label :city, "City" %><br />
    <%= f.text_field :city %></div>
  <div><%= f.label :nationality, "Nationality" %><br />
    <%= country_select(:user, :nationality, {selected: "UG"}) %></div>
    <div>
    <%= f.label :avatar %>
    <%= f.file_field :avatar %>
  </div>
  <div>
    <%= f.label :terms_of_service, "Agree to Terms of Service" %> <br>
    <%= f.check_box :terms_of_service %>
  </div>
  <%= f.submit "Register", class: "btn btn-primary" %>
  <% end %>

如需任何帮助,请提前感谢

我认为您的构思有一些错误。 该向导在用户注册后运行。 因此,基本上,您需要先在没有向导的情况下创建用户

创建您的用户 如果您对模型用户使用Desive,那么您已经在某个地方有了一个用户控制器。实际上,如果您使用的是Deviate,那么类UsersController是无用的

因此,如果您想在注册后重定向到向导步骤,则需要覆盖Desive registration controller文档:。 为此,请创建一个新控制器,如下所示:

class RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(resource)
    user_steps_path(:finishing_step) #add proper route
  end
end
添加步骤 邪恶向导的工作原理如下: -一个控制器,具有2个动作显示和更新 -N个步骤的N个视图1个步骤=1个视图,42个步骤=42个视图

您可以在“操作显示”和“使用步骤更新”中访问当前步骤的名称

渲染向导渲染当前步骤的视图 render_wizard@user呈现下一步视图或当前步骤视图(如果有任何错误)

使用强参数 在控制器中,从不使用用户参数。 因此,在更新操作中,您永远不会使用表单中的参数更新@user。当前用户不为您调用用户参数

另外,save和update_属性之间有很大区别,我认为您希望在更新操作中使用第二个属性

最好将user_参数也放在private部分

控制器的最终形式 我想你的控制器应该是这样的:

  class UserStepsController < ApplicationController
    include Wicked::Wizard

    steps :finishing_step

    def show
      @user = current_user
      render_wizard
    end

    def update
      @user = current_user
      if @user.update_attributes(user_params)
        # because you only have one step, you don't need render_wizard @user
        redirect_to_finish_wizard
      else
        render_wizard
      end
    end

    private

    def user_params
      params.require(:user).permit(:first_name, :middle_name, :last_name, :address_first_line, :address_second_line, :city, :nationality)
    end

    def redirect_to_finish_wizard
      redirect_to root_path, notice: "Thanks for signing up."
    end
  end
看医生 我想你错过了《邪恶博士》中的一些提示。 也许你应该重读一遍。

您的基本设置错误,或者我不理解用户\u步骤\u控制器的重要性。plus@user=user.newparams[:user]真是个坏主意,请查看RailsHanks中的strong_params以获取帮助您的代码是正确的和有用的,尽管我的问题是我想在使用电子邮件和密码注册后使用wicked更新我的用户我想wicked更新其他字段,然后保存第3部分。使用强参数应该可以解决您的问题。在my wicked controllercode def user_params params中执行此步骤。要求:user.permit:first_name、:middle_name、:last_name、:address_first_line、:address_second_line、:city、,:国籍End我意识到无论何时使用user或current_user,我的表单中都会出现一些错误,参数错误不能为零,无论何时使用user。最后,它没有保存,我真的无法确定在我的表单helperIt上使用什么,这并不是因为您定义了将自动触发的方法user_参数。我想你不知道强参数是如何工作的。
  class UserStepsController < ApplicationController
    include Wicked::Wizard

    steps :finishing_step

    def show
      @user = current_user
      render_wizard
    end

    def update
      @user = current_user
      if @user.update_attributes(user_params)
        # because you only have one step, you don't need render_wizard @user
        redirect_to_finish_wizard
      else
        render_wizard
      end
    end

    private

    def user_params
      params.require(:user).permit(:first_name, :middle_name, :last_name, :address_first_line, :address_second_line, :city, :nationality)
    end

    def redirect_to_finish_wizard
      redirect_to root_path, notice: "Thanks for signing up."
    end
  end