0

У меня есть приложение, которое имеет модель объекта, в каждом месте есть много событий, и каждое событие имеет много sign_ups как signupable (у меня есть еще одна модель, которая также имеет регистрацию). Моя проблема заключается в том, что я пытаюсь создать подписку на конкретное событие со страницы места. Вот мой соответствующий код:Rails 5 контроллер before_action метод не принимает формы params

Модели:

# app/models/venue.rb 
class Venue < ApplicationRecord 
    has_many :events, dependent: :destroy 
end 


# app/models/event.rb 
class Event < ApplicationRecord 
    belongs_to :venue 
    has_many :sign_ups, as: :signupable 
end 


# app/models/sign_up.rb 
class SignUp < ApplicationRecord 
    belongs_to :signupable, polymorphic: true 
end 

Контроллеры:

#app/controllers.sign_ups_controller.rb 

class SignUpsController < ApplicationController 
    before_action :find_signupable 

    def new 
     @sign_up = SignUp.new 
    end 

    def create 
     @sign_up = @signupable.sign_ups.new sign_up_params 

     if @sign_up.save 
     redirect_to :back 
     flash[:notice] = 'Your submission was received!' 
     else 
     redirect_to :back 
     flash[:danger] = "Error: #{@sign_up.errors.full_messages.to_sentence}" 
     end 
    end 

    private 

    def sign_up_params 
     params.require(:sign_up).permit(:first_name, :last_name, :phone, :email, :num_guys, :num_girls, :date) 
    end 

    def find_signupable 
     @signupable = Event.find(params[:event_id]) if params[:event_id] 
     @signupable = Event.find(params[:event]) if params[:event] 
    end 
end 

Форма:

# app/views/venues/_sign_up_form.html.html 

= form_for [@venue, SignUp.new] do |f| 
    .form-group 
    %label{ :for => "event" } Event ID 
    = f.select :event, options_from_collection_for_select(@venue.events, :id, :name), {:prompt => "Select Date"}, {class: "form-control", id: "event"} 
    .form-group 
    = f.submit "Submit", class: "form-control" 

Когда я пытаюсь отправить форму, я получаю следующее сообщение об ошибке:

NoMethodError at /venues/20/sign_ups 
undefined method `sign_ups' for nil:NilClass 

Я довольно новичок в рельсах и не уверен, что я делаю неправильно. Я предполагаю, что find_signupable не получает params[:event].

ответ

0

Параметры из вашей формы будет, как показано ниже:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"(snip)", "sign_up"=>{"event"=>"2"}, "commit"=>"Submit", "venue_id"=>"1"} 

Как вы сказали, find_signupable не получает params[:event]. Таким образом, идентификатор события находится в params[:sign_up][:event]. Это будет найти событие правильно:

def find_signupable 
    # If you use Ruby 2.3 or above, you may do params.dig(:sign_up, :event) instead of this: 
    event_id = params[:sign_up] && params[:sign_up][:event] 

    @signupable = Event.find(event_id) if event_id 
end 

(Примечание 1) Обратите внимание, что, как ваш пример использует @venue в шаблоне, он должен быть определен в new действия, как это:

@venue = Venue.find(params[:venue_id]) 

(Примечание 2) Кроме того, ваш f.select :event в шаблоне поднимет NoMethodError, так как модель SignUp не имеет event. Поэтому я думаю, что вам нужно изменить его на f.select :signupable_id и изменить методв контроллере, как показано ниже:

def find_signupable 
    # If you use Ruby 2.3 or above, you may do params.dig(:sign_up, :signupable_id) instead of this: 
    signupable_id = params[:sign_up] && params[:sign_up][:signupable_id] 

    @signupable = Event.find(signupable_id) if signupable_id 
end 
Смежные вопросы