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>