如何用Rails中的另一个控制器覆盖模型控制器

时间:2016-03-09 12:48:23

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

问题:

为什么路线仍然在寻找properties/create以及如何让它路由到admin_panels/properties#create

阐释:

我正在从头开始创建自己的管理面板。创建管理面板的主要原因是允许用户轻松执行new的{​​{1}},editupdatecreatedestroy操作模型。因此,我为property创建了一个新PropertiesController来覆盖现有的admin panel

我对此的期望是在user创建新的property之后,它将使用admin_panels/properties#create创建属性。但是,我得到的是它试图找到一条到properties/create的路线不正确。

AdminPanels::PropertiesController

class AdminPanels::PropertiesController < PropertiesController
  before_action :set_property, only: [:show, :edit, :update, :destroy]

  def index
    @properties = Property.all
  end

  def show
  end

  def new
    @property = Property.new
  end

  def edit
  end

  def create
    @property = Property.new(property_params)

    respond_to do |format|
      if @property.save
        format.html { redirect_to ADMIN_PANEL_PROPERTY_SHOW }
      else
        format.html { render ADMIN_PANEL_PROPERTY_NEW }
      end
    end
  end

  def update
    respond_to do |format|
      if @property.update(property_params)
        format.html { redirect_to ADMIN_PANEL_PROPERTY_SHOW }
      else
        format.html { render ADMIN_PANEL_PROPERTY_EDIT }
      end
    end
  end

  def destroy
    @property.destroy
    respond_to do |format|
      format.html { redirect_to ADMIN_PANEL_PROPERTY_INDEX }
    end
  end

  private
  def set_property
    @property = Property.find(params[:id])
  end

  def property_params
    params.require(:property).permit(:name, :description, :address)
  end
end

覆盖现有的PropertiesController

class PropertiesController < ApplicationController
  before_action :set_property, only: [:show]

  def index
    @properties = Property.all
  end

  def show
  end

  private
  def set_property
    @property = Property.find(params[:id])
  end

  def property_params
    params.require(:property).permit(:name, :description, :address)
  end
end

的routes.rb

resources :users
resources :properties, only: [:index, :show]
namespace :admin_panels do
  resources :properties
end

更新:

观点&gt; admin_panels&gt;创建&gt; _form.html.slim

= simple_form_for(@property) do |f|
  = f.error_notification

  .form-inputs
    = f.input :name
    = f.input :description
    = f.input :address

  .form-actions
    = f.button :submit

2 个答案:

答案 0 :(得分:0)

目前,propertiesindex的路由为showadmin_panels下的路由包含properties

的所有操作路由

更改您的路由文件:

resources :users
namespace :admin_panels do
  resources :properties, only: [:index, :show]
end

在终端中写下以下命令以查看路由。

rake routes

在终端中编写以下命令以查看admin_panels

的路由
rake routes | grep admin_panel

以表格形式指定操作和控制器:

<%= simple_form_for @course_group, 
                    url: url_for(
                                 action: 'create',
                                 controller: 'admin_panels/properties'
                                ),
                    method: :post do |f| %>

语法可能略有不同。

答案 1 :(得分:0)

您可以通过两种方式尝试,首先使用普通url,也可以使用simple_form_for的url_for帮助。

正常方式,

<%= simple_form_for @provider, :url => admin_panel_properties_create_path, :method => :post do |f|%> 

使用助手

<%= simple_form_for  @provider,  url: url_for( action: 'create',controller: 'admin_panels/properties'),  method: :post do |f| %>