【问题标题】:How to overriding model controller with another controller in Rails如何在 Rails 中用另一个控制器覆盖模型控制器
【发布时间】:2016-06-23 20:30:07
【问题描述】:

问题:

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

说明:

我正在从头开始创建自己的管理面板。创建管理面板的主要原因是让用户可以轻松地为property 模型执行neweditupdatecreatedestroy 操作。所以,我为admin panel 创建了一个新的PropertiesController 来覆盖现有的。

我对此的期望是在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

更新:

视图 > admin_panels > 创建 > _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

【问题讨论】:

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


    【解决方案1】:

    您可以通过两种方式进行尝试,首先使用普通的 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| %>
    

    【讨论】:

      【解决方案2】:

      目前,indexshow 的路由为 properties,在 admin_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| %>
      

      语法可能略有不同。

      【讨论】:

      • 这不是问题。如果我这样做,我将只有admin_panels/properties/indexadmin_panels/properties/show/:id 的路径。但是,我希望 admin_panels/properties 能够处理所有事情,而属性只能具有 indexshow 操作。你有什么解决办法吗?
      • 在这种情况下,您要在哪里提交表单,请指定您想要去的特定路径。
      • 我已经更新了我的问题。目前,它重定向到[POST] /properties(不存在)而不是[POST] /admin_panels/properties。但是为什么它仍然想使用propeties_controller 中的post create 而不是admin_panels::properties_controller
      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      相关资源
      最近更新 更多