Пользователь должен существовать в Rails 5 - PullRequest
0 голосов
/ 25 сентября 2018

Моя частичная форма выглядит следующим образом:

<%= 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 %>

Когда я пытаюсь создать новую запись в таблице через форму, появляется сообщение об ошибке «пользователь должен существовать», чтохорошо для меня.

Как автоматически вставить (в какой файл / раздел я должен поместить код) текущий зарегистрированный идентификатор пользователя в форму в фоновом режиме, не вводя его пользователем вручную?

Я перенес все приложение в облако на http://github.com/cheese1884/197451 -

Ответы [ 4 ]

0 голосов
/ 25 сентября 2018

Есть много способов реализовать это, так как я понимаю, у вас есть поле 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
0 голосов
/ 25 сентября 2018

Предполагая, что ваше поле в таблице называется user_id, и вы используете Devise.

Вы должны вставить следующее в вашу форму

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

Идентификатор пользователя (взят из current_user Devise) будетбыть заселённым в скрытом поле, которое они не смогут увидеть.

0 голосов
/ 25 сентября 2018

В соответствии с документацией о модели пользователя

app / models / guitar.rb

class Guitar < ApplicationRecord
  belongs_to :user
end

app / models / user.rb

class User < ApplicationRecord
  has_many :guitars
end

в рельсах5 принадлежит_ к связи, требуемой по умолчанию , что означает, что во время создания каждой записи guitar user_id требуется.

Таким образом, здесь, на контроллере, вы можете решить это: -

В devise после 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 голосов
/ 25 сентября 2018

Если вы хотите войти в систему пользователя в фоновом режиме, используйте помощник sign_in внутри действия вашего контроллера:

sign_in(:user, user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...