我试图仅显示登录用户从数据库创建的记录,并且不知道该怎么做。当我尝试访问数据库并识别要从中获取的特定数据时,我收到错误。
小时控制器
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'
谢谢!
答案 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%>