用户必须存在于Rails 5中

时间:2018-09-25 00:19:56

标签: ruby-on-rails devise

我的表单部分如下:

<%= 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推送到云–

4 个答案:

答案 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