无法找到没有找到ID轨道4记录的HourLog

时间:2015-08-10 22:35:22

标签: ruby-on-rails ruby-on-rails-4

我试图仅显示登录用户从数据库创建的记录,并且不知道该怎么做。当我尝试访问数据库并识别要从中获取的特定数据时,我收到错误。

小时控制器

   class HoursController < ApplicationController
  before_action :require_user
  def new
    @hour = HourLog.where(:user_id => current_user.id)
    @entry = HourLog.all
  end
  def create
    @hour = HourLog.new(hour_params)
    @hour.User_id = current_user.id if current_user
    @hour.status = 'Pending'
    if @hour.save
      redirect_to '/dashboard'
    end
  end
  private
  def hour_params
    params.require(:hour_log).permit(:assignment, :hours, :supervisor, :date,)
  end
end

小时视图(new.html.erb)(将数据输入数据库的字段)

<% @entry.each do |hour| %>
              <tr>
                <td><%= hour.assignment %></td>
                <td><%= hour.hours %></td>
                <td><%= hour.supervisor %></td>
                <td><%= hour.date %></td>
                <td><%= hour.status %></td>
              </tr>
          <% end.empty? %>
          <%= form_for(@hour, url: hours_path) do |f|%>
              <tr>
                <td id="dashfield"><%=f.text_field :assignment, :placeholder=> "Assignment"%></td>
                <td id="dashfiled"><%=f.text_field :hours, :placeholder => "Hours"%></td>
                <td id="dashfield"><%=f.text_field :supervisor, :placeholder=> "Supervisor/Location"%></td>
                <td id="dashfield"><%=f.date_field :date, :placeholder=> "Date"%></td>
                <%=f.hidden_field :status, :value => "Pending" %>
                <%=f.hidden_field :User_id, :value => current_user.id %>
                <td id="dashbtn"><%=f.submit 'Create' %></td>
              </tr>
          <%end%>

错误:

Started GET "/dashboard" for 127.0.0.1 at 2015-08-10 17:29:08 -0500
Processing by HoursController#new as HTML
  User Load (0.0ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = ? LIMIT 1  [["id", 4]]
Completed 404 Not Found in 18ms

ActiveRecord::RecordNotFound (Couldn't find HourLog without an ID):
  app/controllers/hours_controller.rb:4:in `new'

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为这个功能:

def new
   @hour = HourLog.where(:user_id => current_user.id)
   @entry = HourLog.all
end

应更改为:

def new
   @hour = current_user.hour_logs.new
   @entry = current_user.hour_logs.all
end

假设模型user配置了has_many :hour_logs

与您的模型中一样,user有许多hour_logs表格hour_logs必须有一个列user_id小于大写字母

要将列名从User_id更改为user_id,您需要创建新的迁移。 在命令提示符下导航到rails app文件夹并执行:

rails g migration fixcolumn1

这会在名为your-app-path/db/migrate的{​​{1}}中生成一个文件 编辑此文件,以便存在以下内容:

some-date_fixcolumn1.rb

之后返回提示并执行

def change
  rename_column :hour_logs, :User_id, :user_id
end

它应该从那里起作用

答案 1 :(得分:2)

假设用户has_many hour_logs和HourLog belongs_to用户... 访问“/ hours / new?user_id = 123”以填写新的hour_log表单。成功保存后,用户将重定向到“/ users /:user_id”页面,在那里他们只会看到当前登录用户创建的记录...这就是你要求的:)希望这会有所帮助!

#config/routes.rb
Rails.application.routes.draw do
  get '/hours/new', to: "hours#new"
  post '/hours/create', to: "hours#create"
  get '/users/:user_id', to: "users#index"
end

#controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @user_hours = User.find(params[:user_id]).hour_logs
  end
end

#controllers/hours_controller.rb
class HoursController < ApplicationController
  before_action :require_user

  def new
    @user_hours = User.find(params[:user_id]).hour_logs
  end

  def create
    User.find(params[:user_id]).hour_logs.create!(
      assignment: params[:assignment],
      hours:      params[:hours],
      supervisor: params[:supervisor],
      date:       params[:date],
      status:     params[:status]
    )
    redirect_to "/users/#{params[:user_id]}"
  end
end

#hours view
<% @user_hours.each do |hour| %>
    <tr>
      <td><%= hour.assignment %></td>
      <td><%= hour.hours %></td>
      <td><%= hour.supervisor %></td>
      <td><%= hour.date %></td>
      <td><%= hour.status %></td>
    </tr>
<% end %>
<%= form_for "", url: {controller: 'hours', action: 'create'}, method: "post" do |f|%>
    <tr>
      <td id="dashfield"><%=f.text_field :assignment, :placeholder=> "Assignment"%></td>
      <td id="dashfiled"><%=f.text_field :hours, :placeholder => "Hours"%></td>
      <td id="dashfield"><%=f.text_field :supervisor, :placeholder=> "Supervisor/Location"%></td>
      <td id="dashfield"><%=f.date_field :date, :placeholder=> "Date"%></td>
      <%=f.hidden_field :status, :value => "Pending" %>
      <%=f.hidden_field :user_id, :value => params[:user_id] %>
      <td id="dashbtn"><%=f.submit 'Create' %></td>
    </tr>
<%end%>