kyopa’s blog

自分用プログラミングアウトプット

メモ

 

 

  • 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があるビューにとべない。

 

原因

 

sign_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を使わないようにした。

 

 

よくわからないけどそうするとできた