2014-09-17 2 views
1

내 질문은 매우 간단합니다 : 어떻게하면 aasm 단추를 클릭 할 때 전환을 변경할 수 있습니까? 내 견해에 무엇을 넣어야합니까?Ruby on rails 버튼 클릭시 AASM 변경 전환

나는 두 개의 버튼, ApproveReject이 있습니다. 내 상태는 다음과 같습니다 :

aasm :column => 'state' do 
    state :pending, :initial => true 
    state :approved 
    state :rejected 

    event :approve do 
     transitions :to => :approved, :from => [:pending] 
    end 

    event :reject do 
     transitions :to => :rejected, :from => [:pending] 
    end 
    end 

UPDATE를 : 내 PARAMS이 있습니다

{"utf8"=>"✓", "_method"=>"put", "authenticity_token"...", "commit"=>"APP", "id"=>"65"}합니다.

그리고 이것이 내가보기에서 조치를 액세스하는 방법입니다 :

= form_for([:admin, shop], method: :put, data: { confirm: "You sure?" }) do |f| 
    = f.submit "Approve", :controller => :shops, :action => :approve 

내 컨트롤러 코드 :

def approve 
    @shop = Shop.find(params[:id]) 
    @shop.approve! 
end 

경로 : 주, 전환을 추가하여

namespace :admin do 
    get "shops/:id/approve" => "shops#approve" 

답변

5

Srikanth에서 언급 한 바와 같이, 당신은 내가 다음과 같이 button_to를 사용하는 것이 좋습니다 것 대신 노골적인 form를 사용하지만, 컨트롤러에 요청을 보낼 것이다 컨트롤러에 대한 요청.

#config/routes.rb 
namespace :admin do 
    resources :shops do 
     put :approve #-> domain.com/admin/shops/:id/approve 
     put :disapprove #-> domain.com/admin/shops/:id/disapprove 
    end 
end 

#app/controllers/admin/shops_controller.rb 
class Admin::ShopsController < ApplicationController 
    before_action, :set_shop 

    def approve 
     @shop.approve! 
    end 

    def disapprove 
     @shop.disapprove! 
    end 

    private 

    def set_shop 
     @shop = Shop.find params[:id] 
    end 
end 

이 당신에게 양식에 필요한 데이터를 전송하는 효율적인 방법을 줄 것이다하는로 AASM 과정을 트리거 : 당신은 이미이 일을하는 것이 아니라 명확히하는 것, 다음 사용하는 것이 좋습니다 결과.

2

Aasm 작동을하고 이벤트를 모델에 보냅니다.

보기에서 직접 모델에 액세스 할 수 없습니다. 대신 컨트롤러에 버튼을 바인딩 할 수있는 각각의 액션을 만들 수 있습니다.

aasm 이벤트에는 논리가 있습니다. 어느 이벤트로 전환 할 수 있습니까? 모든 유효성 검사를 수행하고 컨트롤러 조치에서 적절한 응답 메시지를 제공 할 수 있습니다.

편집 : 여기

내가 그것을 할 것입니다 방법에 대한 아이디어 :

FooController.rb :

class FooController < ApplicationController 
    def approve 
    foo = Foo.find(params[:id]) 
    foo.approve! 
    end 

    def reject 
    foo = Foo.find(params[:id]) 
    foo.reject! 
    end 
end 

routes.rb :

get "foo/:id/approve" => "foo#approve" 
get "foo/:id/reject" => "foo#reject" 

함께 Foo 교체 당신의 모델!

<%= button_to "Approve", admin_shops_approve(shop.id), method: :put %> 
<%= button_to "Disapprove", admin_shops_disapprove(shop.id), method: :put %> 

이 보내드립니다 :

+0

고마워요, Srikanth! 컨트롤러에 액션을 추가하고 뷰에서 액세스했습니다. 하지만 이제는이 오류를 해결해야합니다 :'param이 없거나 값이 비어 있습니다 : hotel'. 도와 줄수있으세요? 나는 갱신을했다. 다시 한 번 감사드립니다! –

+0

컨트롤러 코드를 게시 할 수 있습니까? 샘플을 여기에 넣었습니다. –

+0

감사합니다. 하지만 미안하지만, 같은 오류. 나는 또한 업데이 트 .. 그리고 또한, 버튼을 클릭 URL을 http : // localhost : 3000/admin/shops/65 (끝에 '승인')처럼 클릭하십시오. –

1

동일한 문제가있었습니다.내가 이런 식으로 해결했습니다

resources :calls do 
    member do 
    put :run 
    put :stop 
    put :resolve 
    end 
end 

보기 routes.rb

모델을

class Call < ActiveRecord::Base 

    include AASM 

    aasm_column :status 

    aasm do 
    state :start, :initial => true 
    state :in_progress 
    state :finished 
    state :archived 

    event :run do 
    transitions :from => [:start, :finished, :archived], :to => :in_progress 
    end 

    event :stop do 
     transitions :from => :in_progress, :to => :finished 
    end 

    event :resolve do 
     transitions :from => [:in_progress, :finished], :to => :archived 
    end 
    end 
end 

컨트롤러

class CallsController < ApplicationController 
    before_action :set_call, only: [:run, :stop, :resolve] 

    def run 
    redirect_to calls_path if @call.run! 
    end 

    def stop 
    redirect_to calls_path if @call.stop! 
    end 

    def resolve 
    redirect_to calls_path if @call.resolve! 
    end 

    private 

    def set_call 
     @call = Call.find(params[:id]) 
    end 
end 

경로/index.html.erb

호출
<table> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Status</th> 
     <th>Start call</th> 
     <th>Stop call</th> 
     <th>Resolve call</th> 
    </tr> 
    </thead> 

    <tbody> 
    <% @calls.each do |call| %> 
     <tr> 
     <td><%= call.name %></td> 
     <td><%= call.status %></td> 
     <td><%= link_to "Start", run_call_path(call) , method: :put %></td> 
     <td><%= link_to "Stop", stop_call_path(call), method: :put %></td> 
     <td><%= link_to "Resolve", resolve_call_path(call), method: :put %></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 
+0

작동 방식에 대한 코드에 주석을 추가 할 수 있습니까? – Shawn

+0

뷰 파일이 추가되었습니다. 나는 link_to 도우미를 사용하고 있습니다 – Sanychcz

+0

어딘가에 Call table이 있습니까? 나는 다른 모델에 aasm_state 컬럼을 가지고있다. 그래서 이것은 작동 할 것이라고 생각하지 않는다. – james