我有模型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方法的地方,或者根本不重定向?
答案 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