2017-10-17 13 views
0

私のアプリケーションはいくつかのパラメータを管理し、バッチジョブを開始するためにETLに必要なトークンをユーザが生成できるようにします。ログインしているユーザーは、常に現在のトークンをページの右上に表示し、更新することができます。その後、トークンをETLパラメータ・ファイルにコピー/ペーストしてジョブを開始することができます。これを実現するためにRuby on Rails 5でカスタムパッチルートを指定する方法は?

が、私はapplication.html.rbに次のように挿入:

  <nav class="top_menu"> 
       <ul> 
        <% if user_signed_in? %> 
        <li> <%= t('User') %>: <%= link_to (current_user.first_name + ' ' + current_user.name), edit_user_registration_path %></li> 
        <li> | <%= t('Token') %>: <%= current_user.api_token %> </li> 
        <li> | <%= link_to t('Sign_out'), destroy_user_session_path, method: "delete" %></li> 
        <% else %> 
        <li> <%= link_to t('Sign_in'), new_user_session_path %></li> 
        <% end %> 
        <li> | <%= link_to t('Help'), help_path("help-index") %> </li> 
       </ul> 
        <% if user_signed_in? %> 
         <!-- token generation form --> 
         <%= form_for current_user, :url => {:controller =>"users_controller", :action => "set_token", :method => "patch"} do |f| %> 
            <% if current_user.errors.any? %> 
             <div id="error_explanation"> 
              <h2><%= pluralize(current_user.errors.count, "error") %> prohibited this user from being saved:</h2> 

              <ul> 
              <% current_user.errors.full_messages.each do |message| %> 
               <li><%= message %></li> 
              <% end %> 
              </ul> 
             </div> 
            <% end %> 
          <ul> 
           <li><%= t('Count') %>: <%= f.text_field :api_token_count, :size => "4" %> </li> 
           <li><%= t('Validity') %>: <%= f.text_field :api_token_validity, :size => "10" %> </li> 
           <li class="actions" ><%= f.submit "Renew" %></li> 
          </ul> 
         <% end %> 
        <% end %> 
      </nav> 

ユーザーコントローラは、この機能が含まれています

def set_token 
    @user.updated_by = current_user.user_name 
    @user.api_token = (BCrypt::Password.create(current_user.user_name+Time.now.to_i.to_s)) 

    respond_to do |format| 
    if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'Token was successfully renewed.' } 
     format.json { render :show, status: :ok, location: @user } 
    else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

そしてroutes.rbをファイルには、この追加が含まれていますメンバールート:

devise_for :users 

resources :users, :only=>[:edit, :update, :show, :index, :set_token] do 
    patch 'set_token', on: :member 
end 

これはRails(/ rails/info/route)によって正しく生成されたようですS):

set_token_user_path PATCH /users/:id/set_token(.:format) users#set_token

RailsのActionControllerはUrlGenerationErrorを発行します。私はおそらくルーティングメカニズムで何かを誤解

No route matches {:action=>"set_token", :controller=>"users_controller", :method=>"patch"}

... はあなたの助けをありがとう!

答えて

0

あなたの構文は少しオフだと思います。試してみてください:

form_for(current_user, url: set_token_user_path(current_user), html: {method: "patch"})

または:

form_for(current_user, url: set_token_user_path(current_user), method: :patch)

を私はRailsのドキュメントでこれらの例の両方を発見しました。

関連する問題