0

コントローラーの正しいアクションを指すボタンを取得する際に問題が発生しています。私のショービューには次のボタンがあります。

<%= button_to "Submit for Approval", {action: "submit", :id => @ecn.id}  %>
<%= button_to "Close ECN", {action: "close", :id => @ecn.id}, :onclick => "return confirm('Once an ECN is closed it can no longer be edited, are you sure you want to close this ECN?')" %>

私のコントローラーには、次の2つのアクションがあります。

  def submit

    @ecn = Ecn.find(params[:id])
    @email_list = EmailList.all

    respond_to do |format|
      EcnNotifier.submit_engineering(@ecn).deliver if @ecn.distribute_engineering?
      EcnNotifier.submit_purchasing(@ecn).deliver if @ecn.distribute_purchasing?
      EcnNotifier.submit_manufacturing(@ecn).deliver if @ecn.distribute_manufacturing?
      EcnNotifier.submit_qantel(@ecn).deliver if @ecn.distribute_qantel?
      EcnNotifier.submit_planning(@ecn).deliver if @ecn.distribute_planning?
      format.html { redirect_to ecns_url, alert: "Ecn has been submitted for approval." }
      format.json { render json: @ecns }
    end
  end

  def close
    @ecn = Ecn.find(params[:id])
    @ecn = @ecn.close_status

    respond_to do |format|
      EcnNotifier.close_engineering(@ecn).deliver if @ecn.distribute_engineering?
      format.html { redirect_to ecns_url, alert: "Ecn has been closed.  A confirmation email has been sent to the appropriate personnel." }
      format.json { render json: @ecns }
    end
  end

「承認のために送信」ボタンをクリックすると、送信アクションが期待どおりに実行されます。[ECN を閉じる] ボタンをクリックすると、期待どおりにアラートが表示されますが、閉じるアクションではなく送信アクションが処理されます。「Close ECN」ボタンをクリックすると、開発ログに次のように表示されます。

    Started POST "/ecns/index?id=34" for 127.0.0.1 at 2013-11-03 11:53:02 -0700
    Processing by EcnsController#submit as HTML
    ...

したがって、間違ったアクションを呼び出していることがわかります。何が原因なのかはわかりませんが、ルーティングについてはよくわかりませんが、ルートファイルも次のとおりです。

Engdb::Application.routes.draw do

  resources :email_lists

get 'home' => 'home#index'
get 'logout' => 'sessions#destroy'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'

  get "login/index"

  get "sessions/new"

  get "sessions/create"

  get "sessions/destroy"

  resources :users

  get "home/index"

  resources :ecns

  resources :revisions

  resources :drawings

  resources :home

 match 'ecns/index' => 'ecns#submit'
 match 'ecns/index' => 'ecns#close'

2 つのアクションを作成したときに、2 つの「一致」行を追加しました。何か案は?

4

2 に答える 2

1

問題は、 と のルートが同一のパスと HTTP 動詞ecns#submitを持っていることです。ecns#close

レールがルートを処理する方法はroutes.rb、リクエストに一致する最初のパスが見つかったときに停止するというものです。したがって、 へのリクエストecns/indexは常に に送信されecns#submitます。パスが同一の場合、ルーターはどのアクションに送信するかをどのように認識しますか?

に別のパスを指定するecns#closeか、アクションごとに別の HTTP 動詞 ( postfor#submitdeleteforなど) を指定してみてください#close

于 2013-11-03T19:21:15.293 に答える
0

close アクションのルートでパスを使用してみてください。また、ルートに基づいて正しい HTTP 動詞を使用していることを確認してください (POST と PUT の可能性が最も高い):

<%= button_to "Close ECN", {:url => <close_path>, :method => <:put/:post>, :id => @ecn.id}, :onclick => "return confirm('Once an ECN is closed it can no longer be edited, are you sure you want to close this ECN?')" %>
于 2013-11-03T19:19:15.833 に答える