Rails Polymorphic - 控制器&意见

时间:2015-04-16 13:22:02

标签: ruby-on-rails ruby-on-rails-3

您好我尝试根据可事件类型创建活动。可事件类型是团体或商店。

编写我的代码,我目前确定他们是创建我的路由和控制器的更好方法(仍然是新手)

有没有办法在可事件类型中只创建一个new和create方法传递?

型号:

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"

1 个答案:

答案 0 :(得分:0)

如果它只是您关注的路由,而不是操作的数量,您可以使用约束来允许单个路径变量将请求发送到多个操作之一,这在某些情况下很有用您可能希望从多个操作中有多个按钮,从单个表单读取,或者您只想简化路径变量命名。

使用commit_param_routing gem并在您的路线文件中,您可以编写如下内容:

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

对不起,如果它不是你想要的或不清楚的,我的第一个答案!