用户必须存在于Rails 5中

问题描述 投票:0回答:4

我的表格部分如下:

<%= 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的云端 -

ruby-on-rails devise
4个回答
0
投票

有很多方法可以实现这一点,因为我知道你在Guitar模型中有一个user_id字段。

简单的解决方案是需要在创建操作时将user_id附加到Guitar对象。

GuitarControllercreate并添加这一行。 .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

2
投票

假设您在表中的字段称为user_id,并且您正在使用Devise。

您应该在表单中插入以下内容

<%= form.hidden_field :user_id, value: current_user.id %>

用户的id(取自Devise的current_user)将预先填入他们无法看到的隐藏字段中。


1
投票

根据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


0
投票

如果要在后台登录用户,请在控制器的操作中使用sign_in帮助程序:

sign_in(:user, user)
© www.soinside.com 2019 - 2024. All rights reserved.