2017-04-15 32 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 

室的新觀點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是得到一個""值(空白),所以沒有Userid=""被發現。

這是因爲即使它是空白,它也會在if (user_id = session[:user_id])中評估爲true。所以你需要爲此進行驗證;使用presence方法可能適合你的需要:

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當對象的值是空白的(或nil),或將返回,否則對象的值;和nil計算結果爲false

+0

它給了我同樣的錯誤 – Cesar

+0

我更新了代碼(在'elsif'中增加了'presence')。但它可能會給你另一個錯誤,因爲如果'session [:user_id]'和'cookies.signed [:user_id]'都是'nil','@ current_user'將不會被設置。 – Gerry

+0

它再次給我同樣的錯誤。我更新了配置路線,也許這是一個錯誤,我不知道 – Cesar

1

您正在創建一個與您的用戶已有關係的新對象,因此,user_id將是強制性的。因此,您可以直接使用它的參數創建它,在這種情況下,您不需要首先參考current_user創建它,然後將其作爲關聯進行構建。

檢查更改create方法來自:

@rm = current_user.rms.build(rms_params) 

只是爲了:

@rm = Rms.new(rms_params) 

而且隨着你的形式在你app/views/rms/new.html.erb你已經手動爲user_id分配值:

# 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_idRM.new

的CURRENT_USER方法返回使用find_by取用戶的ID通過會話用戶:

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

檢查this回購來看看它是如何工作的。

+0

它仍然給我同樣的錯誤,你告訴我評論方法current_user? – Cesar

+0

這更有意義!很好的接收。 – Gerry

+0

檢查你的「調整」'current_user'幫手@Cesar。 –