数時間試した後、データベースに保存できません。
コンテキストは次のとおりです。2つのタイプのユーザーがあります。1つは非常に基本的な情報[ユーザー名、電子メール、パスワード]のみが必要であり、もう1つは多くの情報[年齢、性別、都市など]が必要なユーザーです。 ]
テーブルに大量のNull値があるため、STIは使用しませんでした。そこで、ユーザーがプロファイル(プロファイルテーブル)を持っているか、タイプ[1または2]に依存しない、この3つのモードを作成しました。このプロファイルのフィールドは、このユーザーが住んでいる都市であり、 DB、都市テーブル
class User < ActiveRecord::Base
has_one :profile
has_one :city, through: :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
belongs_to :city
[...a bunch of fields here]
end
class City < ActiveRecord::Base
has_many :profiles
has_many :users, through: :profiles
end
Railsコンソールでそれらを操作すると、すべて問題なく動作します。
usr = User.new(name: "roxy", email: "roxy@example.me", password: "roxanna", password_confirmation: "roxanna", utype: 1)
cty = City.new(name: "Bucaramanga")
prf = Profile.new (rname: "Rosa Juliana Diaz del Castillo"...)
prf.city = cty
usr.profile = prf
usr.valid?
=> true
usr.save
=> true
しかし、アプリに保存しようとすると(モデルを表示)
<%= f.label :city, "En que ciudad te encuentras?"%>
<%= select_tag :city, options_from_collection_for_select(City.all, 'id', "name"),{:prompt => 'Selecciona tu ciudad'}%>
def new
@profile = Profile.new
end
def create
@profile = params[:profile]
@city= City.find_by_id(params[:city].to_i)
@profile.city = @city
end
このエラーが発生します:
undefined method `city=' for #<ActiveSupport::HashWithIndifferentAccess:0xa556fe0>
誰か助けてくれませんか?
更新 Davidが提案したように、createメソッドの最初の行にProfileオブジェクトを作成したので、コントローラーは次のようになります。
def create
@profile = Profile.new(params[:profile])
@city= City.find_by_id(params[:city].to_i)
@profile.city = @city
@usr = current_user
if @usr.profile.exists? @profile
@usr.errors.add(:profile, "is already assigned to this user") # or something to that effect
render :new
else
@usr.profile << @profile
redirect_to root_path
end
end
しかし、私は今このエラーを受け取っています
undefined method `exists?' for nil:NilClass
current_userは@current_userを返します
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
教えていただけませんか、何が間違っているのですか?