我的表单部分如下:
<%= 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推送到云–
答案 0 :(得分:2)
假设表中的字段称为user_id,并且您正在使用Devise。
您应在表单中插入以下内容
<%= form.hidden_field :user_id, value: current_user.id %>
用户的ID(来自Devise的current_user)将预先填充在他们看不见的隐藏字段中。
答案 1 :(得分:1)
根据用户模型中提到的文档
app / models / guitar.rb
class Guitar < ApplicationRecord
belongs_to :user
end
app / models / user.rb
class User < ApplicationRecord
has_many :guitars
end
在导轨5 belongs_to association required by default中
这意味着在创建guitar
user_id
的每个记录时都是必需的。
所以在这里,您可以通过控制器来解决它:-
在登录后进行设计时,有一个帮助方法current_user
是当前登录的用户
在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
由于您已经弄乱了装置的current_user和您的自定义current_user,请修改controllers/application_controller
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
注意:-您也可以用吉他形式将current_user.id
通过hidden_field :user_id
,但是出于安全方面的考虑,这并不好,因为用户可以通过浏览器调用任何user_id
。
答案 2 :(得分:0)
如果您想在后台登录用户,请在控制器操作中使用sign_in
帮助程序:
sign_in(:user, user)
答案 3 :(得分:0)
有很多方法可以实现此目的,据我了解,您在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))
已编辑
您那里有很多错误,首先需要清理控制器。
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