Ruby on Rails - 使用STI注册表单(无效注册问题)

时间:2015-02-26 07:42:12

标签: ruby-on-rails forms

我会直截了当地说我对网站设计和开发的概念很新。现在,我遇到了一个我似乎无法找到解决方案的问题。

我正在尝试扩展到mhartl的Ruby on Rails教程。我创建了自己的示例应用程序,但添加了一个。在注册表单上,我有两个单选按钮来确定帐户类型,可以是服务提供商或财产持有人。

我模特的一些背景知识。我有一个基本用户控制器和模型。我的属性持有者和服务提供者模型使用单表继承从基本用户模型继承。

如果我提供了所有正确的详细信息并提交了有效的注册,那么一切都很好,它会将我重定向到显示页面。

当我注册不正确但是其中一个帐户类型的单选按钮已关闭时,会出现问题。第一次单击“提交”时,将显示错误标签,并且URL会从/ signup更改为/ base_users。如果我再次单击“提交”,则会收到错误消息,其中显示" param丢失或值为空:base_user"

以下是我的一些代码。

从我在终端收到的调试消息判断,我觉得它与我的应用程序向/ service_providers而不是/ base_users提交发布请求有关,但我不确定如何解决这个问题,或者如果它甚至是根本问题。你能帮助我解决我的任何误解并引导我朝着正确的方向前进吗?非常感谢。

添加/视图/ base_users / new.html.erb

<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@base_user) do |f| %>
        <%= render 'shared/error_messages' %>

        <%= f.label :name %>
        <%= f.text_field :name, class: 'form-control' %>

        <%= f.label :email %>
        <%= f.email_field :email, class: 'form-control' %>

        <%= f.label :password %>
        <%= f.password_field :password, class: 'form-control' %>

        <%= f.label :password_confirmation, "Confirmation" %>
        <%= f.password_field :password_confirmation, class: 'form-control' %>


        <label>
            <%= f.radio_button :type, "PropertyHolder", label: "test", class: 'form-control' %>Property Holder
        </label>

        <label>
            <%= f.radio_button :type, "ServiceProvider", label: "test", class: 'form-control' %>Service Provider
        </label>


      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

应用程序/控制器/ base_users_controller.rb

class BaseUsersController < ApplicationController
  def index
   @base_users = BaseUser.where(:type => params[:type])
  end

  def show
    @base_user = BaseUser.find(params[:id])
  end

  def new
    @base_user = BaseUser.new
    @base_user.type = params[:type]
  end

  def create
    @base_user = BaseUser.new(user_params)
    if @base_user.valid?
      if @base_user.type == "PropertyHolder"
        @property_holder = @base_user
          if @property_holder.save
          flash[:success] = "Welcome to the Sample App!"
          redirect_to @property_holder
        else 
          render 'new'
        end
      elsif @base_user.type == "ServiceProvider"
        @service_provider = @base_user
        if @service_provider.save
          flash[:success] = "Welcome to the Sample App!"
          redirect_to @service_provider
        else 
          render 'new'
        end
        else
            render 'new'
        end
    else
      render 'new'
    end
  end 

  private

    def user_params
        params.require(:base_user).permit(:name, :email, :password,
        :password_confirmation, :type)
    end
end

我的路线文件中与注册相关的重要部分如下:

get   'signup'                            =>    'base_users#new'

resources :base_users
resources :property_holders, :controller => 'base_users', :type =>   "PropertyHolder"
resources :service_providers, :controller => 'base_users', :type => "ServiceProvider"

1 个答案:

答案 0 :(得分:0)

我发现了为什么它不起作用,当我重新渲染new.html.erb时,它将@base_user作为PropertyHolder / ServiceProvider进行投射。我只需要将@base_user显式地转换为base_user。

/views/base_user/new.html.erb

<%= form_for(@base_user, as: :base_user) do |f| %>