2016-05-24 12 views
0

私は旅程をアップロードし、他のユーザーの旅程を自分のプロフィールに「ダウンロード」できるように、旅程Webアプリケーションを作成しました。どんな理由であれ、私のダウンロードボタンがダウンロードコントローラにルーティングされるのではなく、それは旅程コントローラにルーティングされ、私のアプリケーションを壊す。なぜ私は理解できないようです - あなたが手伝ってくれることを願っています。エラーを引き起こす間違ったアクションへのルートを形成

ここで旅程ショーのページのダウンロードボタンがあります:

旅程/ show.html.erb

<% if logged_in? %> 
    <% unless current_user.downloaded?(@itinerary) %> 
    <%= render 'download' %> 
    <% end %> 
<% else %> 
    <p> 
    You need to be logged in to download this. 
    </p> 
<% end %> 

ダウンロード制御に部分的にレンダリングすべきルート:

の旅程/_download.html.erb

<%= form_for(current_user.downloadeds.build) do |f| %> 
    <div><%= hidden_field_tag :downloaded_id, @itinerary.id %></div> 
    <%= f.submit "Download", class: "btn btn-primary" %> 
<% end %> 

代わりDownloadsController

class DownloadsController < ApplicationController 
    before_action :logged_in_user 
    def create 
    #download id is established in the download form 
    @itinerary = Itinerary.find(params[:downloaded_id]) 
    current_user.download(@itinerary) 
    redirect_to @itinerary 
    end 

旅程コントローラにルートを、これが次のエラーを返し:

ActionController error - param is missing or value is empty: itinerary

itineraries_controller.erbを

def create 
    @itinerary = current_user.itineraries.build(itinerary_params) 
    #@user = User.find(params[:id]) 

    if @itinerary.save 
     # render the page with the users itineraries 
     flash[:success] = "Your itinerary has been added!" 
     redirect_to request.referrer || current_user 
    else 
     #show the add itinerary page 
     flash[:error] = @itinerary.errors.full_messages 
     render 'new' 
    end 
    end 

設定/ルートform_for

# You can have the root of your site routed with "root" 
    root 'static_pages#home' 
    get 'signup' => 'users#new' 
    get 'help' => 'static_pages#help' 
    get 'about' => 'static_pages#about' 
    get 'login' => 'sessions#new' 
    post 'login' => 'sessions#create' 
    delete 'logout' => 'sessions#destroy' 

    resources :users 

    resources :itineraries do 
    resources :reviews 
    end 

    resources :downloads, only: [:create, :show] 

    mount PdfjsViewer::Rails::Engine => "/pdfjs", as: 'pdfjs' 

答えて

0

、そこに別のコントローラに移動するには、それを伝えるものは何もないので、あなたはそれを追加する必要があります。この種のオプションを指定することができます:

<%= form_for(current_user.downloadeds.build, url: {controller: downloads}) do |f| %> 

ダウンロードが送信されるコントローラを変更する必要があります。ハッシュ引数(例:url: { controller: 'controller_name', action: 'action_name' })、ルートヘルパー(例:url: download_path(@download))、明示的なURL(例:url: "http://example.com")を指定できます。選択する形式は、ニーズと好みに基づいています。

+0

@ morales257これがあなたの質問に答えた場合は、答えの隣のチェックマークをクリックしてそれを受け入れてください。チェックマークが緑色に変わります。アップホーテも常に高く評価されています。 :D –

関連する問題