【问题标题】:Rails Polymorphic - controller & viewsRails 多态 - 控制器和视图
【发布时间】:2015-04-16 23:08:11
【问题描述】:

您好,我正在尝试根据可事件类型创建一个事件。 eventable 类型是 group 或 shop。

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

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

型号:

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"

【问题讨论】:

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


    【解决方案1】:

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

    使用 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
    

    抱歉,如果它不是您要找的或不清楚的,我的第一个答案!

    【讨论】:

    • 我忘了说这个也给你添加了一个路由路径变量,并且都使用相同的路径名,保持路由简单,只是通过你选择的常量路由到不同的动作
    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2013-11-17
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多