2015-04-16 6 views
1

Привет Я пытаюсь создать событие в зависимости от типа события. допустимый тип - это группа или магазин.Rails Polymorphic - controller & views

Дать свой код, я в настоящее время уверен, что их лучший способ создать свои маршруты и контроллер (до сих пор рельсы новичка)

Есть ли способ, чтобы создать только один новый и создать метод пропуска в eventable тип ?

Модели:

class Event < ActiveRecord::Base 
    belongs_to :eventable, polymorphic: true 

class Group < ActiveRecord::Base 
    has_many :events, as: :eventable 

class Shop < ActiveRecord::Base 
    has_many :events, as: :eventable 

Маршруты:

resources :events do 
    collection do 
    get :new_national_event 
    get :new_local_event 
    post :create_national_event 
    post :create_local_event 
    end 
do 

событий контроллера:

def index 
    @search = Search.new(params[:search]) 
    @shop = find_user_shop(@search.shop_id) 
    @group = @shop.group 
    @shop_events = @shop.events 
    @group_events = @group.events 
end 

def new_national_event 
    @user = current_user 
    @event = @user.group.events.new 
end 

def new_local_event 
    @shop = find_user_shop(@search.shop_id) 
    @event = @shop.events.new 
end 


def create_national_event 
    user = current_user 
    @event = user.group.events 

    if @event.save! 
    flash.now[:notice] = "Votre événement national a bien été enregistré" 
    render :index 
    else 
    flash.now[:error] = "Erreur lors de l'enregistrement du événement national" 
    render :new 
    end 
end 

def create_local_event 
    user = current_user 
    @event = user.group.shop.events 

    if @event.save! 
    flash.now[:notice] = "Votre événement local a bien été enregistré" 
    render :index 
    else 
    flash.now[:error] = "Erreur lors de l'enregistrement du événement local" 
    render :new 
    end 
end 

просмотров:

index.html.slim 

    = link_to new_national_event_events_path 
    = link_to new_local_event_events_path 

new_national_event_events_path.html.slim

= form_for @event, :url => create_national_event_events_path, :method => :post do |f| 

    div class="field" 
    = f.text_field :title, :required => true 

    div class="field" 
    = f.text_field :threshold, :required => true 


    div class="form-actions" 
    =f.submit "Create", class: "btn blue" 

ответ

0

Если только маршрутная вы обеспокоены, а не количество действий, которые можно использовать ограничения, чтобы позволить одной переменной пути отправить запрос одному из множественного числа действий, это может быть полезно в некоторых случаях, когда вы можете иметь несколько кнопок для нескольких действий, все из которых читаются из одной формы, или если вы просто хотите упростить именования переменных маршрутов.

использовать commit_param_routing камень и в свой файл маршрутов вы можете написать что-то вроде:

resources :events do 
    collection do 
    post :save, constraints: CommitParamRouting.new(EventController::CREATENATIONAL), action: :create_national_event 
    post :save, constraints: CommitParamRouting.new(EventController::CREATELOCAL), action: :create_local_event  
    end  
end 

добавить константы к контроллеру:

class EventController  
    CREATENATIONAL = "create national"  
    CREATELOCAL = "create local"  
    .....  
end 

, а затем все, что осталось, чтобы добавить их к вашим кнопкам отправки файла просмотра:

div class="form-actions"  
    .row  
    .col-xs-2  
     =f.submit EventController::CREATENATIONAL  
    .col-xs-2  
     =f.submit EventController::CREATELOCAL 

извините, если это не совсем то, что летнее u искали или неясно, мой первый ответ!

+0

Я забыл упомянуть об этом, также добавляет переменную пути маршрута для вас, и оба используют одно и то же имя пути, сохраняя простую маршрутизацию, и они просто направляются на разные действия через константу, которую вы выбираете –

Смежные вопросы