Как я могу передать идентификаторы из двух разных моделей в новую? - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время я пытаюсь передать User_id и Event_id в качестве параметров для гостя:

Прямо сейчас в консоли я могу создать новый гостевой объект, используя:

Guest.new(user_id: #, event_id: #)

После создания В качестве гостевого объекта я могу вызвать «User.assited_events», чтобы получить все события, которые помогает этому пользователю, так же, как и с событиями, я могу вызвать «Event.assitances», чтобы объединить всех пользователей, помогающих этому событию.

Я просто хочу выяснить способ отправки user_id и event_id из событий # index.

Я использую собственный метод под названием «Assist» внутри контроллера событий

def assist
    @guest = Guest.create(:user_id => User.find(session[:current_user_id]), :event_id => Event.find(params[:id]))

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end

Это текущая строка для связи assist_event_path с событиями # index

<td><%= link_to 'Assist', assist_event_path(event), method: :put, data: { confirm: 'Do you want to assist to this event?' } %></td>

Результат в журнале сервера передает оба идентификатора, но объект Guest не создан:

Processing by EventsController#assist as HTML
  Parameters: {"authenticity_token"=>"8nddKRZpYcgYDkfJIv/VXK8Os1FmW1oZ+zRIQUnLlE/dhgIA92chq++leqplfaB+bdqIZnCWlB0vPLRfuoHOGw==", "id"=>"1"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 4], ["LIMIT", 1]]
  ↳ app/controllers/events_controller.rb:65:in `assist'
  Event Load (0.2ms)  SELECT "events".* FROM "events" WHERE "events"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/events_controller.rb:65:in `assist'

Модель пользователя

class User < ApplicationRecord
  has_many :events
  has_many :guests
  has_many :assisted_events, :through => :guests, :source => :event
end

Модель события

class Event < ApplicationRecord
  belongs_to :user
  has_many :guests
  has_many :assistances, :through => :guests, :source => :user
end

Модель гостя

class Guest < ApplicationRecord
  belongs_to :user
  belongs_to :event
end

файл маршрутов

Rails.application.routes.draw do
  resources :events do
     member do
        patch :assist
        put :assist
      end
  end
  resources :users

  root 'events#index'
end

РЕДАКТИРОВАТЬ - -

Контроллер событий

class EventsController < ApplicationController
  before_action :set_event, only: [:show, :edit, :update, :destroy]

  # GET /Events
  # GET /Events.json
  def index
    @events = Event.all
  end

  # GET /Events/1
  # GET /Events/1.json
  def show
  end

  # GET /Events/new
  def new
    @event = User.find(session[:current_user_id]).events.build
  end

  # GET /Events/1/edit
  def edit
  end

  # POST /Events
  # POST /Events.json
  def create
    @event = User.find(session[:current_user_id]).events.build(event_params)

    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'Event was successfully created.' }
        format.json { render :show, status: :created, location: @event }
      else
        format.html { render :new }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /Events/1
  # PATCH/PUT /Events/1.json
  def update
    respond_to do |format|
      if @event.update(event_params)
        format.html { redirect_to @event, notice: 'Event was successfully updated.' }
        format.json { render :show, status: :ok, location: @event }
      else
        format.html { render :edit }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /Events/1
  # DELETE /Events/1.json
  def destroy
    @event.destroy
    respond_to do |format|
      format.html { redirect_to events_url, notice: 'Event was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def assist
    @guest = Guest.create(:user_id => User.find(session[:current_user_id]), :event_id => Event.find(params[:id]))

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def event_params
      params.require(:event).permit(:title, :body)
    end
end

События # Индексный файл

<p id="notice"><%= notice %></p>

<h1>Events</h1>
<% if session[:current_user_id].is_a? Integer %>
  <h3>Current User ID: <%= session[:current_user_id] %></h3>
<% else %>
  <%= link_to 'Create a new user', new_user_path  %>
<% end %>
<table>
  <thead>
    <tr>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @events.each do |event| %>
    <tr>
      <td><%= event.title  %></td>
      <td><%= event.body  %></td>
      </tr>
      <tr>
        <td><%= link_to 'Show', event %></td>
        <td><%= link_to 'Edit', edit_event_path(event) %></td>
        <td><%= link_to 'Assist', assist_event_path(event), method: :put, data: { confirm: 'Do you want to assist to this event?' } %></td>
    </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New event', new_event_path %>

1 Ответ

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

Ну, это своего рода предположение, так как вы не опубликовали ни одной своей формы, кроме link_to. Я понятия не имею, какие переменные вы передали в events#index, потому что вы не опубликовали свой код контроллера для этого. Тем не менее, вы можете передать любые параметры, которые вы хотите с link_to. edit OK, похоже, что пользователь в session[:current_user_id], поэтому отсюда и идентификатор пользователя ...

последнее изменение для упрощения

Добавьте этот маршрут перед вашими другими маршрутами, чтобы убедиться, что он наверху:

put '/assist' => 'events#assist'

Затем в вашей форме:

<td><%= link_to 'Assist', assist_path(event_id: event, user_id: session[:current_user_id]), method: :put, data: { confirm: 'Do you want to assist to this event?' } %></td>

Убедитесь, что ваши параметры разрешены в вашем сильном раздел параметров.

# Only allow a list of trusted parameters through.
def event_params
  params.require(:event).permit(:title, :body, :event_id, :user_id)
end

edit очистка кода вашего контроллера:

def assist
    @guest = Guest.new(:user_id => session[:current_user_id], :event_id => event_params[:id])

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end

Вы передавали фактические объекты Event и User для создания объекта @guest. Также вы использовали params, что означает, что вы не проходили действие event_params. Цель действия event_params - разрешить / запретить, чтобы кто-то не мог отправить параметры, которые вам не нужны.

...