0

我是 Rails 平台的新手……我在单击表单中的注册时遇到保存用户注册信息的问题……我没有收到任何错误,但在检查 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 %>

提前感谢任何帮助

4

1 回答 1

0

我认为你的概念有一些错误。该向导在您的用户注册后运行。所以基本上,您需要先在没有向导的情况下创建您的用户。

  1. 创建您的用户

如果您将设计与您的模型一起使用User,那么您已经在某处拥有一个用户控制器。实际上,如果您使用的是 Devise,您的类 UsersController 是无用的。

因此,如果您想在注册后重定向到您的向导步骤,那么您需要覆盖设计注册控制器(文档:重定向到特定页面)。为此,请创建一个新的控制器,如下所示:

class RegistrationsController < Devise::RegistrationsController
  protected

  def after_sign_up_path_for(resource)
    user_steps_path(:finishing_step) #add proper route
  end
end

我没有你的 config/route.rb 文件的内容,但你需要有这样的东西:

resources :user_steps
  1. 添加步骤

邪恶的向导是这样工作的: - 一个控制器有 2 个动作(显示和更新) - N 个视图,N 个步骤(1 个步骤 = 1 个视图,42 个步骤 = 42 个视图)

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

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

  1. 使用强参数

在您的控制器中,您永远不会使用user_params. 因此,在您的更新操作中,您永远不会使用表单中的参数来使用您的@user。current_user不会为您调用 user_params。

save此外, and和之间存在很大差异update_attributes,我认为您想在更新操作中使用第二个。

最好将 user_params 也放在私有部分中。

  1. 控制器的最终形式

你的控制器应该看起来像我猜的那样:

  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
  1. 阅读文档

我认为您错过了邪恶文档中的一些提示。也许你应该重新阅读它。 邪恶的医生

于 2015-04-01T09:54:57.893 回答