0

かなりの属性を含むオブジェクト「デバイス」があります。デバイスの 1 つを編集するときに、コピー ボタンを押すと新しいデバイスが作成され、その「編集ページ」が読み込まれ、古いデバイス パラメータが text_field に入力されるようにしたいと考えています。しかし、ボタンを使用してアクション制御メソッドを呼び出す方法について非常に混乱しており、現在、次のエラーが表示されています

"一致するルートがありません {:action="clone", :controller="device", :id="1"}"

「クローン」メソッドの呼び出しを機能させることができれば、私は良い状態になると思います。どんな助けでも大歓迎です!私の現在のコードは次のとおりです。

edit.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

オブジェクトのルビーですでに定義されているため、コントローラーメソッドに「clone」という名前を付けると、あいまいな問題がなくなりません。http://ruby-doc.org/core-2.0.0/Object.html #method-i-clone

以前は ActiveRecord でオーバーライドされていましたが、最近の ActiveRecord はこの機能に #dup を使用しています。ルートとリンク ラベルで 'clone' を引き続き使用できますが、コントローラーの実際のメソッドには別のものを使用します。たとえば、メソッド 'my_clone" を呼び出す場合、ルートで ' :as => 'my_clone' ' オプションを使用したい場合があります。

于 2013-09-30T15:16:28.163 に答える