Как отладить, почему обновление не будет работать с ассоциациями Rails? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь настроить простое приложение rails с функциональностью доски объявлений.Я мог добавлять задания в базу данных, пока не добавил связь между моей моделью заданий и моделью пользователя.Теперь он не будет обновлять базу данных при заполнении формы.

jobs_controller

class JobsController < ApplicationController
  def index
    @jobs = Job.all
  end

  def new
    @job = Job.new
  end

  def listing
  end

  def listings
  end

  def create

    @job = Job.new(params.require(:job).permit(:title, :description, :url, :user_id))

    if @job.save
      redirect_to root_path
    else
      render "new"
    end
  end
end

new.html.erb

<%= simple_form_for @job do |form| %>
  <%= form.input :title, label: "Job title" %>
  <%= form.input :description, label: "Description" %>
  <%= form.input :url, label: "URL" %>
  <%= form.button :submit %>
<% end %>

index.html.erb

<% @jobs.each do |job| %>
  <div class="job">
    <h2><%= link_to job.title, job.url %></h2>
    <p><%= job.description %></p>
  </div>
<% end %>
<p><%= link_to "Add a job", new_job_path %></p>

user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :jobs
end

job.rb

class Job < ApplicationRecord
    belongs_to :user

end

В консоли нет ошибки, но база данных не выглядитобновляться или не обновляется представление.

Я также запустил миграцию:

class AddUserToJob < ActiveRecord::Migration[5.2]
  def change
    add_reference :jobs, :user, foreign_key: true
  end
end

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вы можете получить пользователя с помощью current_user в Devise.

class JobsController < ApplicationController
  # This restricts the actions to authenticated users and prevents a nil error
  before_action :authenticate_user, except: [:show, :index]

  # ...

  def create
    # this sets the user_id column
    @job = current_user.jobs.new(job_params)
    if @job.save
      # you really should set a flash message or something to notify the user
      # and possibly redirect to the show or index action instead
      redirect_to root_path
    else
      render "new"
    end
  end

  private 
  def job_params 
    params.require(:job)
          .permit(:title, :description, :url, :user_id)
  end
end
1 голос
/ 29 апреля 2019

Если вы не хотите связывать задание немедленно с пользователем, вам нужно изменить привязку на необязательную, например:

class Job < ApplicationRecord
  belongs_to :user, optional: true
end

В противном случае вам нужно указать user_id в форме или установить его в действии контроллера.


Вы также должны делегировать эту часть отдельному методу

def job_params
  params.require(:job).permit(:title, :description, :url, :user_id)
end

Job.new(job_params)
...