Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 迁移后添加新列时出现意外的NoMethodError_Ruby On Rails 4_Devise_Sti - Fatal编程技术网

Ruby on rails 4 迁移后添加新列时出现意外的NoMethodError

Ruby on rails 4 迁移后添加新列时出现意外的NoMethodError,ruby-on-rails-4,devise,sti,Ruby On Rails 4,Devise,Sti,我有一个从用户模型继承的玩家模型,与同样从用户模型继承的第三个模型教练共享身份验证逻辑设计 class User < ActiveRecord::Base end class Player < User end class Coach < User end 然后运行迁移 rails g migration AddClubCoachEmailToPlayer club_coach_email:string rake db:migrate 档案 class AddClubCo

我有一个从用户模型继承的玩家模型,与同样从用户模型继承的第三个模型教练共享身份验证逻辑设计

class User < ActiveRecord::Base
end
class Player < User
end
class Coach < User
end
然后运行迁移

rails g migration AddClubCoachEmailToPlayer club_coach_email:string
rake db:migrate
档案

class AddClubCoachEmailToPlayer < ActiveRecord::Migration
  def change
    add_column :players, :club_coach_email, :string
  end
end
现在,我需要将该字段添加到/views/players/registrations/new

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  #...

  <div><%= f.label :position %><br />
    <%= f.radio_button(:position, "Striker") %> Striker
    <%= f.radio_button(:position, "Midfielder") %> Midefielder
    <%= f.radio_button(:position, "Defender") %> Defender
  </div>
  <div><%= f.label :club_coach_email %><br />
  <%= f.email_field :club_coach_email %></div>

  <div><%= f.label :profile_name %><br />
  <%= f.text_field :profile_name %></div>

 #...
很明显,这就是轨迹指向的地方

<%= f.radio_button(:position, "Defender") %> Defender
 </div>
 <div><%= f.label :club_coach_email %><br />
 <%= f.email_field :club_coach_email %></div>

 <div><%= f.label :profile_name %><br />
 <%= f.text_field :profile_name %></div>

我在这里似乎不明白什么?

至于我,你做得太复杂了。从您提供的信息来看,这三种不同的用户类型之间没有不同的功能,因此,不通过继承而是使用

这样,您将拥有一个用户模型,其中包含三个不同的角色:用户、玩家、教练

或者还有其他方法-以设计的方式使用不同的模型: rails g设计用户+rails g设计玩家+rails g设计教练


在此之后,您将获得三个几乎独立的模型,每个模型都具有所有Desive功能和方法,例如:player_signed_in?、current_coach、authenticate_player!等等

如果你把你的观点放进去会发生什么?它是说用户吗?不是,它表示玩家资源的名称是什么?你在视野中看到了什么?这也显示了玩家。我的想法是,这与我用Desive清理参数的方式有关。这是一种方法,是的,但我仍然对我的错误感到困惑。
class PlayerParameterSanitizer < Devise::ParameterSanitizer
  private
  def sign_up
    default_params.permit(:first_name, :last_name, :profile_name, :password, :password_confirmation, :email, :grad_year, :position, :club_team, :formation, :club_coach_email)
  end
  def account_update
    default_params.permit(:first_name, :last_name, :profile_name, :password, :password_confirmation, :email, :grad_year, :position, :club_team, :formation)
  end
end
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(user)
    dashboard_path
  end

  protected
  def devise_parameter_sanitizer
    if resource_class == Player
      PlayerParameterSanitizer.new(Player, :player, params)
    elsif resource_class == Coach
      CoachParameterSanitizer.new(Coach, :coach, params)
    else
      super
    end    
  end 
end
undefined method `club_coach_email' for #<Player:0x00000109296be8>
<%= f.radio_button(:position, "Defender") %> Defender
 </div>
 <div><%= f.label :club_coach_email %><br />
 <%= f.email_field :club_coach_email %></div>

 <div><%= f.label :profile_name %><br />
 <%= f.text_field :profile_name %></div>