用户必须存在于Rails 5中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用户必须存在于Rails 5中相关的知识,希望对你有一定的参考价值。
我的表格部分如下:
<%= form_with(model: guitar, local: true) do |form| % >
<% if guitar.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(guitar.errors.count, "error") %> prohibited this
guitar from being saved:</h2>
<ul>
<% guitar.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<div class="form-group">
<%= form.label :title %>
<%= form.text_field :title, class: "form-control" %>
</div>
<div class="form-group">
<%= form.label :description %>
<%= form.text_area :description, class: "form-control" %>
</div>
<div class="form-group">
<%= form.submit "Create New Guitar Lesson", class: "btn btn-primary"
%>
</div>
<% end %>
当我尝试通过表单在表格中创建一个新条目时,会弹出一条错误消息“用户必须存在”,这对我来说很好。
如何在不让用户手动键入的情况下自动插入(我应该将代码放入哪个文件/部分)当前登录的用户ID到表单?
我已经把整个应用程序推到了http://github.com/cheese1884/197451的云端 -
有很多方法可以实现这一点,因为我知道你在Guitar模型中有一个user_id字段。
简单的解决方案是需要在创建操作时将user_id附加到Guitar对象。
在GuitarController
去create
并添加这一行。 .merge(user_id: current_user.id)
。
记住用户必须登录才能获得current_user
对象。
样品:
@g = Guitar.new(guitar_params.merge(user_id: current_user.id))
编辑
你有很多bug,首先你需要清理你的控制器。
ApplicationController:删除6-18之间的行。不需要它,因为Devise gem已经为您提供这些功能。
GuitarsController:
def guitar_params
params.require(:guitar).permit(:name, :description)
end
// guitar view from
<div class="form-group">
<%= form.label :name %>
<%= form.text_field :name, class: "form-control" %>
</div>
// models/user.rb
//add this line
has_many :guitars
假设您在表中的字段称为user_id,并且您正在使用Devise。
您应该在表单中插入以下内容
<%= form.hidden_field :user_id, value: current_user.id %>
用户的id(取自Devise的current_user)将预先填入他们无法看到的隐藏字段中。
根据doc提到的用户模型
应用程序/模型/ guitar.rb
class Guitar < ApplicationRecord
belongs_to :user
end
应用程序/模型/ user.rb
class User < ApplicationRecord
has_many :guitars
end
在轨道5 belongs_to association required by default,这意味着在创建guitar
user_id
的每个记录时是必需的。
所以在控制器你可以通过以下方式解决:
在sign_in之后的设计中,有一个帮助方法,current_user
是当前的logged_in用户
在guitars_controller.rb
def create
new_guitar_record = current_user.guitars.new(guitar_params)
if new_guitar_record.save
#guitar created successfully for current logged in user
else
#current_user.guitar.errors.full_messages
end
end
def guitar_params
params.require(:guitar).permit(:name, :description)
end
请修改controllers/application_controller
,因为你搞砸了devise的current_user和你的自定义current_user
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
注意: - 您也可以通过current_user.id
以吉他形式传递hidden_field :user_id
,但出于安全考虑,这并不好,因为用户可以通过浏览器调用任何user_id
。
如果要在后台登录用户,请在控制器的操作中使用sign_in
帮助程序:
sign_in(:user, user)
以上是关于用户必须存在于Rails 5中的主要内容,如果未能解决你的问题,请参考以下文章
Rails 5 验证失败:志愿者默认事件必须存在....但是为啥会这样以及如何做到这一点
“父必须存在”和“没有为CommentsController找到模板#create,呈现head:no_content”Rails 5