2014-09-17 1 views
1

Мой вопрос очень прост: как я могу изменить aasm переходы при нажатии кнопки? На что я должен полагаться?Рубины на рельсах AASM Изменение перехода при нажатии кнопки

У меня есть две кнопки: Approve и Reject. Мои состояния выглядеть следующим образом:

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, вы хотите, чтобы отправить запрос к контроллеру, однако, вместо того, чтобы использовать form сразу, я бы рекомендовал использовать button_to следующим образом:

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

Это будет посылать запрос к вашему контроллеру . Вы уже, кажется, делают это, но уточнить, вы хотите использовать следующее:

#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 имеют логику, I.e. Какое событие вы можете перевести на и т. Д. Вы можете выполнить все эти проверки и предоставить соответствующее ответное сообщение из действия вашего контроллера.

Edit:

Вот идея, как я хотел бы сделать это:

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 с ваша модель!

+0

Спасибо, Шрикант! Я добавил действие к контроллеру и получил доступ к нему из представления. Но теперь я должен решить эту ошибку: 'param отсутствует или значение пустое: hotel'. Не могли бы вы мне помочь? Я сделал обновление. Еще раз спасибо! –

+0

Не могли бы вы разместить код контроллера? Я поставил здесь образец, вы тоже можете это сослаться. –

+0

Спасибо! Но извините, такая же ошибка. Я обновил .. И также, при нажатии кнопки URL-адрес похож на http: // localhost: 3000/admin/stores/65 (в конце не утверждается). –

1

У меня была такая же проблема.Я решить это так:

Модель

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 

Маршруты routes.rb

resources :calls do 
    member do 
    put :run 
    put :stop 
    put :resolve 
    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 helper – Sanychcz

+0

У вас есть таблица вызовов где-нибудь? У меня просто столбец aasm_state на другой модели, не предназначенной для состояний, поэтому я не думаю, что это сработает. – james