从关系的非多态方面重定向

时间:2016-04-08 00:52:02

标签: ruby-on-rails ruby ruby-on-rails-4

我有模型Event,Meeting,TaskList和TaskItem。 TaskList与Event和Meeting处于多态关系。 TaskItem嵌套在TaskList中,如下面的路线所示:

  concern :has_task_lists do
    resources :task_lists, only: [:new, :index, :create, :show]
  end

  resources :events, concerns: :has_task_lists do
    collection { post :import }
  end

  resources :meetings, concerns: :has_task_lists

  resources :task_lists  do
    resources :task_items, only: [:new, :index, :create] do
      member do
        patch 'complete'
      end
    end
  end

由于控制器处理多态路由的方式,create方法无法重定向回TaskItem视图。使用指向TaskItem控制器中的load_listable方法的错误

task_items_controller

def create
  @task_item = @task_list.task_items.new(task_item_params)
  if @task_item.save
    redirect_to @task_list, notice: "Item Created"
  end
end

task_lists_controller

def load_listable
    klass = [Event, Meeting].detect { |c| params["#{c.name.underscore}_id"]}
    @listable = klass.find(params["#{klass.name.underscore}_id"])
end

这是因为请求没有klass,因为它是从关系的非多态方面发送的。我可以让它工作的唯一方法是执行redirect_to:back,这是不可取的,因为它不会重定向到task_item显示页面,因为它处于部分模态中。

所以我的问题基本上是如何让它重定向到task_item显示页面,这是调用create方法的地方,或者根本不重定向?

1 个答案:

答案 0 :(得分:1)

我通过将create方法更改为以下内容来解决问题而不重做我的路线:

def create
      @task_item = @task_list.task_items.new(task_item_params)
      if @task_item.save
      klass = "/" + @task_list.listable_type.underscore + "s"
      klass_id = "/" + @task_list.listable_id.to_s
        redirect_to klass + klass_id + task_list_path(@task_list.id), notice: "Item Created"
      else
        redirect_to klass + klass_id + task_list_path(@task_list.id), alert: "Content can't be blank."
      end
  end