2013-09-30 2 views
0

많은 양의 속성이 포함 된 "장치"개체가 있습니다. 장치 중 하나를 편집 할 때 복사 버튼을 눌러 새 장치를 만들고 text_field에 채워진 이전 장치 매개 변수로 "편집 페이지"를로드 할 수 있습니다. 하지만 버튼을 사용하여 동작 제어 방법을 호출하는 방법에 대해 매우 혼란 스럽습니다. 현재 오류가 발생하고 있습니다.레일 복사 버튼 오류

"경로가 일치하지 않습니다. {: action =>"clone ", : controller =>"device " > "1"} "

"clone "메소드를 호출 할 수 있다면 제대로 작동 할 것입니다. 어떤 도움이라도 대단히 감사하겠습니다! 내 현재 코드는 다음과 같습니다

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> 

routes.rb

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

당신은이 같은 경로를 지정해야합니다

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 

답변

0

devices_controller.rb :

resources :devices do 
    member do 
    get :clone 
    end 
end 

그런 다음 clone_device_path(id) 도우미를 사용할 수 있습니다.

또한이 작업에는 게시 방법을 사용하고 링크 대신 단추를 사용하는 것이 좋습니다.

+0

clone_devise_path (id) 도우미를 사용하려면 button_to를 어떻게 설정해야합니까? –

+0

Sth님께 서 '%% button_to'Clone ', clone_devise_path (@ devise.id) %>'. – BroiSatse

+0

아,'@ device.id' : – BroiSatse

0

당신이 이미 객체에 루비에 정의 된대로, 당신이 당신의 컨트롤러 방법 '클론'의 이름을 경우 모호한 문제의 끝이없는거야 : http://ruby-doc.org/core-2.0.0/Object.html#method-i-clone

그것은 액티브에서 재정의하는 데 사용하지만, 최근에 ActiveRecord는이 기능에 #dup를 사용합니다. 경로와 링크 레이블에서 '복제본'을 계속 사용할 수 있지만 컨트롤러의 실제 메소드에는 다른 것을 사용하십시오. 'my_clone'메서드를 호출하면 경로에 ': as =>'my_clone ''옵션을 사용하는 것이 좋습니다.