0

我有一个包含大量属性的对象“设备”。编辑其中一个设备时,我想要一个复制按钮,按下该按钮将创建一个新设备并加载其“编辑页面”,其中旧设备参数填充到 text_field 中。但是我对如何使用按钮调用动作控制方法感到非常困惑,我目前收到一条错误消息

"没有路由匹配 {:action=>"clone", :controller=>"device", :id=>"1"}"

如果我可以调用“克隆”方法来工作,那么我认为我的状态会很好。任何帮助将不胜感激!我当前的代码如下:

编辑.html.erb

<div class="row">
<%= form_for(@device) do |f| %>

  <div class="span3 offset0">
    <%= f.label "Unit Name" %>
    <%= f.text_field :unitName %>

   .
   .
   .

    <%= f.label "Router Terminal Server IP" %>
    <%= f.text_field :routerTerminalServerIp %>
  </div>

  <div class="span3 offset0">

   <%= f.label "N2x Server" %>
   <%= f.text_field :n2xServer %>

   .
   .
   .

   <%= f.label "Last Changed On" %>
   <%= f.text_field :updated_at %>

   <%= f.label "Update, Copy, or Delete Device" %>
   <%= f.submit "Update", class: "btn btn-medium btn-info" %>
   <%= link_to "Clone", :controller => "device", :action => "clone" %>
   <%= link_to "Delete", device_path, class: "btn btn-medium btn-danger" %>
 </div>

 <% end %>
</div>

路线.rb

App::Application.routes.draw do
  resources :devices
  root 'static_pages#home'
  match 'devices/clone',  to: 'devices#clone', via: 'get'  
end

devices_controller.rb

class DevicesController < ApplicationController

  def new
    @device = Device.new
  end

  def clone
    oldDevice = Device.find(params[:id])
    @device = Device.new
    @device = @oldDevice.dup
    @device.save
    redirect_to edit_device_path(@device.id)
  end

  def create
    @device = Device.new(device_params)
    @device.lastChangedBy = request.remote_ip
    if @device.save
     redirect_to edit_device_path(@device.id)
    else
        render 'new'
 end
   end

  def show
    @device = Device.find(params[:id])
  end

  def edit
    @device = Device.find(params[:id])
  end

  def update
    @device = Device.find(params[:id])
    @device.lastChangedBy = request.remote_ip
     if @device.update_attributes(device_params)
        redirect_to edit_device_path(@device)
     else
        render "edit"
end

def destroy
    Device.find(params[:id]).destroy
    redirect_to root_url
end
end

private

    def device_params
      params.require(:device).permit(:unitName, ...., :owner)
    end
end
4

2 回答 2

0

如果您将控制器方法命名为“克隆”,那么您将遇到无穷无尽的问题,因为这已经在 ruby​​ on Object 中定义:http ://ruby-doc.org/core-2.0.0/Object.html #method-i-克隆

它曾经在 ActiveRecord 中被覆盖,但最近 ActiveRecord 使用 #dup 来实现此功能。您仍然可以在您的路线和链接标签中使用“克隆”,但在控制器中的实际方法中使用其他东西;例如,如果您将方法称为“my_clone”,您可能希望在您的路线中使用 ' :as => 'my_clone' ' 选项。

于 2013-09-30T15:16:28.163 回答
0

您应该像这样指定路线:

resources :devices do
  member do
    get :clone
  end
end

然后你可以使用clone_device_path(id)助手。

此外,您应该考虑为此操作使用 post 方法并使用按钮而不是链接。

于 2013-09-30T13:42:43.270 回答