2017-04-15 6 views
1

のユーザーを見つけることができませんでした。ユーザーが何人の担当者と重量に達したかなど、動きの最大反復回数(RM)を保存できるアプリケーションを作成しました。私はRMを作成しようとすると、それは次のエラーを与える:最大担当者が保存されていません。 'id' =

ActiveRecord::RecordNotFound in RmsController#create Couldn't find User with 'id'=

は、これは私のRMコントローラです:

class RmsController < ApplicationController 
    before_action :logged_in_user, only: [:create, :destroy] 
    before_action :load_user, only: [:create] 

    def new 
    @rm = Rm.new 
    @rm.user_id 
    end 

    def create 
    @rm = current_user.rms.build(rms_params) 
    if @rm.save 
     flash[:success] = "Max rep created" 
     redirect_to rms_path 
    else 
     render 'static_pages/home' 
    end 
    end 

    def index 
    @rms = Rm.where(user_id: params[:user_id]) 
    end 

    def destroy 
    @rm = Rm.find(params[:id]) 
    @rm.destroy 
    flash[:success] = "Max rep deleted" 
    redirect_to rms_path 
    end 

    private 
    def rms_params 
     params.require(:rm).permit(:user_id, :content, :quantity, :max) 
    end 

    def load_user 
     @user = User.find(params[:user_id]) 
    end 
    end 

、RMの新しいビューhtml.erb:

<aside class="col-md-8"> 
    <div class="rm_form"> 
     <%= form_for(@rm) do |f| %> 
     <%= render 'shared/error_messages', object: f.object %> 
     <%= f.select :content, ['Back squat', 'Front squat', 'Deadlift', 
           'Sumo Deadlift', 'Sumo Deadlift High Pull', 
           'Power Snatch', 'Power Clean', 
           'Squat Clean', 'Muscle Snatch', 
           'Clean & Jerk', 'Thruster', 'Push Jerk', 
           'Split Jerk', 'Press', 
           'Push press', 'Cluster', 'Overhead Squat']%> 

     <%= f.label :max, "Max reps" %> 
     <%= f.text_field :max, class: 'form-control' %> 

     <%= f.label :quantity, "Weight lifted" %> 
     <%= f.text_field :quantity, class: 'form-control' %> 

     <%= f.hidden_field :user_id, value: current_user.id %> 

     <%= f.submit "Create", class: "btn btn-primary" %> 
     <% end %> 
     </aside> 
</div> 

RMのインデックスビューhtml.erb:

<% @rms.each do |rm| %> 
    <li> 
    <%= p rm.content, rm.quantity, rm.max %> 


    </li> 
    <% end %> 
</ul> 
<div class="center"> 
<%= link_to "Create new max rep", new_rm_path(@rm), class: "btn btn-primary" %> 

現在のユーザーがsessionshelperで定義されています

module SessionsHelper 

    def current_user?(user) 
    user == current_user 
    end 

    def current_user 
    if (user_id = session[:user_id]) 
     @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id]) 
     user = User.find_by(id: user_id) 
     if user && user.authenticated?(:remember, cookies[:remember_token]) 
     log_in user 
     @current_user = user 
     end 
    end 
    end 

はroutes.rbを:

Rails.application.routes.draw do 

    root 'static_pages#home' 
    get '/signup',    to: 'users#new' 
    get '/contact',    to: 'static_pages#contact' 
    get '/about',    to: 'static_pages#about' 
    get '/login',    to: 'sessions#new' 
    post '/login',    to: 'sessions#create' 
    delete '/logout',    to: 'sessions#destroy' 


    resources :account_activations, only: [:edit] 
    resources :password_resets,  only: [:new, :create, :edit, :update] 
    resources :users 
    resources :rms 
    resources :trainings do 
    resources :bookings 
    end 
end 

私は今、なぜそれが私にこのエラーを与え、どのように私はそれを修正することができているしたいと思います。ありがとう

+0

'current_user'はどのように定義されていますか?コードを見せてくれますか? – Gerry

+0

投稿を更新しました!セッションヘルパー – Cesar

答えて

1

user_id""(空白)になるので、id=""ではUserが見つかりません。

空白であっても、trueにはif (user_id = session[:user_id])と評価されるためです。だからあなたはそれを検証する必要があります。 presenceメソッドを使用すると、あなたの必要性に合うことができる:オブジェクトの値が空白(またはnil)である、またはそれ以外のオブジェクトの値を返しますとき

def current_user 
    if (user_id = session[:user_id].presence) 
    @current_user ||= User.find_by(id: user_id) 
    elsif (user_id = cookies.signed[:user_id].presence) 
    user = User.find_by(id: user_id) 
    if user && user.authenticated?(:remember, cookies[:remember_token]) 
     log_in user 
     @current_user = user 
    end 
    end 
end 

presence方法はnilを返します。 nilfalseと評価されます。

+0

で私は同じエラーを返します – Cesar

+0

私はコードを更新しました( 'elsif'に'存在 'を追加しました)。しかし、 'session_:user_id 'と' cookies_signed [:user_id] 'の両方が' nil'でも '@ current_user'が設定されないので、別のエラーが出る可能性があります。 – Gerry

+0

それは私に同じエラーを再び与える。私はconfigルートで更新しました。おそらく、そこにはエラーがあります。私は知らない – Cesar

1

ユーザーと既に関係している新しいオブジェクトを作成しているため、user_idは必須です。したがって、この場合はrms_paramsのパラメータを使用して直接作成することができます。最初にcurrent_userを参照して作成する必要はなく、関連付けとして構築する必要はありません。

:あなたの app/views/rms/new.html.erbすでに手動 user_idに値を代入している中で

@rm = Rms.new(rms_params) 

そしてあなたの形のように:だけに

@rm = current_user.rms.build(rms_params) 

:からあなたcreate方法を変更

チェック

# 1 as the first user created as example 
<input value="1" type="hidden" name="mark[user_id]" id="mark_user_id"> 

何もする必要はありませんあなたのコントローラのrms_controller@rm.user_idに表示されているように、RM.newの下に表示されます。

def current_user 
    @current_user ||= User.find_by(id: session[:user_id]) 
end 

チェック、それがどのように動作するかを確認するthisレポ:

CURRENT_USER方法は、セッションを介してユーザのIDを取っfind_byを使用してユーザーを返します。

+0

それは私に同じエラーを与えます、あなたは私にcurrent_userというメソッドをコメントするように言っていますか? – Cesar

+0

これは理にかなっています!ナイスキャッチ。 – Gerry

+0

"調整"された "current_user"ヘルパー@Cesarを確認してください。 –

関連する問題