Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 单击按钮时RubyonRails AASM更改转换_Ruby On Rails_State_Aasm - Fatal编程技术网

Ruby on rails 单击按钮时RubyonRails AASM更改转换

Ruby on rails 单击按钮时RubyonRails AASM更改转换,ruby-on-rails,state,aasm,Ruby On Rails,State,Aasm,我的问题很简单:如何在单击按钮时更改aasm转换?我应该把什么放在我的观点上 我有两个按钮:批准和拒绝。我的国家是这样的: aasm :column => 'state' do state :pending, :initial => true state :approved state :rejected event :approve do transitions :to => :approved, :from => [:

我的问题很简单:如何在单击按钮时更改
aasm
转换?我应该把什么放在我的观点上

我有两个按钮:
批准
拒绝
。我的国家是这样的:

  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
更新: 我的参数是:

{“utf8”=>“✓",
“_方法”=>“放置”,
“真实性令牌”,
“提交”=>“应用程序”,
“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"

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

用您的型号替换
Foo

Srikanth
所述,您需要将您的请求发送给您的控制器,但是,我建议您使用如下方式,而不是直接使用
表单

<%= button_to "Approve", admin_shops_approve_path(shop.id), method: :put %>
<%= button_to "Disapprove", admin_shops_disapprove_path(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
#config/routes.rb
名称空间:admin do
资源:商店有吗
put:approve#->domain.com/admin/shops/:id/approve
put:dispose#->domain.com/admin/shops/:id/dispose
结束
结束
#app/controllers/admin/shops\u controller.rb
类管理员::ShopsController<应用程序控制器
行动前:设置车间
def批准
@商店,批准!
结束
不赞成
@不赞成!
结束
私有的
def设置车间
@shop=shop.find参数[:id]
结束
结束

这将为您提供一种将所需数据发送到表单的有效方式,从而触发
AASM
过程

我也有同样的问题。我是这样解决的:

模型

查看调用/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>

名称
地位
开始通话
叫停
解决呼叫

创建AASM选择器需要我当前的项目,具体取决于CanCan和current events的许可

如果有人需要此功能,欢迎您使用以下要点:

它的创建速度很快,所以请原谅一些丑陋的方法(将很快重写为更好的格式)


也欢迎您进行复杂集成

您还可以在模型中添加回调 像


*存档\u名称\u

谢谢,斯里坎特!我向控制器添加了操作,并从视图访问它。但现在我必须解决这个错误:
参数丢失或值为空:hotel
。你能帮我吗?我已经更新了。再次感谢!你能发布控制器代码吗?我在这里放了一个样品,你也可以参考。谢谢!但很抱歉,同样的错误。我更新了。。此外,点击按钮时,url类似于(结尾处的no
approve
)。请检查Rich Peck的答案,它比我在电话上键入的内容更全面:)你能为你的代码添加注释吗?添加了查看文件。我在用link_来帮你你有电话台吗?我只是在另一个模型上有一个aasm_state列,不是专门针对州的模型,所以我认为这不可行。我在其中有一个Call table和Status列,用于aasm需求
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
resources :calls do
  member do
    put :run
    put :stop
    put :resolve
  end
end
<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>
before_update { |order| order.log_status_change if order.aasm_state_changed? }