herokuエラー
へろくで500エラーがでたら
一回データベースをリセットすればいい
リセット方法(ヘロク)
heroku pg:reset DATABASE_URL
to prpceed,type() or
かっこの中身をコピペ
その後 heroku run rake db:migrate
すれば完了
メモ
- User translation missing: ja.activerecord.errors.models.luck.attributes.user.required
ジェムをインストール
gem 'rails-i18n'
うおーエラーが日本語になった
_form
<%= form_with(model: @luck, local: true ,url: choose_new_or_edit) do |form| %>
<% if @luck.errors.any? %>
<div id="error_explanation">
<ul>
<% @luck.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
これを追加
model
validates :content, presence: true
追加
luck confirm
def confirm
@luck = Luck.new(luck_params)
@luck.user_id = current_user.id
render :new if @luck.invalid?
@lucks = Luck.new(luck_params)
end
ユーザー情報がないと言われた理由は
@luck.user_id = current_user.id
この記述が抜けてたから!!
これで普通にできた
昨日の機能を振り返る
sign_upインスタンス変数である@targetがあるビューにとべない。
原因
1sign_upした
2user/showに飛ぶ
3user/showは@targetの情報が記載されているのでエラー
解決方法
sign in後 @targetをsaveした後にuser/showを表示させるように工程をかえる
def after_sign_in_path_for(resource)
target = @user.targets.build(target_params)
if target.save
user_path(resource.id)
else
flash[:notice] = ""
new_target_path
end
end
これでtargetがセーブされた後にuser/showにとばすことができました。
後deviseのnoticeは、アカウント登録しましたと表示される
Userはバリテーションをかけていて
@targetはバリテーションではなくtarget_newにとばすしようにした
userとtarget 両方入力 user/showに移動
user情報未入力target情報入力 userのバリテーションがききsign_upの情報に戻る
user情報入力target情報未入力 target/newの画面に移動
メモォーメモォー
def after_sign_in_path_for(resource)
user_path(resource.id)
end
@userにしていたのをresourceにしますたどん
それとアプリケーションコントローラに記述していたのを
レギュレーションコントローラに記述しました。
module ApplicationHelper
def point_comparison(user,target)
return false if user.lucks.blank?
user.lucks.count >= target&.point
end
end
ヘルパーメゾットを使用
ビュー
<% if point_comparison(@user,@terget) %>
これでおっけー^^
よくわかっていないけどメモdeviseのsign_upでバリテーションで引っかかった後に再入力するときだけエラーがでる理由
コントローラ
def new
@target = Target.new
super
end
def create
super
target = @user.targets.build(target_params)
target.save!
end
変更
def new
super
resource.targets.build
end
def create
super
end
アソシエーションをコントローラで記述していたけど
deviseをあまりいじらないほうがいいかなということでコントローラではなくモデルでやることにした。
user.rb追記
accepts_nested_attributes_for :targets
アソシエーションするためこの記述を用意
アプリケーションコントローラ追記
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :avatar, targets_attributes: [:content, :point, :image, :image_cache, :user_id, :luck_id]])
end
カラムの追加
ビュー
<%= fields_for(resource.targets.first) do |target| %>
このように定義
resourceはuser.newと同じような役目をしている事を知ったので
このような記述にした
@targetにするとtargetが2つ準備されるみたい
targets-attributeでpostするとtargetが生成されるので
@tergetを使わないようにした。
よくわからないけどそうするとできた