2016-12-10 10 views
0

カテゴリと製品モデルがあります。製品モデルはカテゴリに属しています。現在、ユーザーに新しい製品フォームを表示させ、ユーザーがリンクをクリックしたカテゴリとしてカテゴリIDを設定するカテゴリの表示ビューにリンクがあります。レールにハンドルパラメータがありません

ユーザーはカテゴリを選択します>カテゴリの[ユーザーが新しい製品をクリックします]カテゴリの[表示]> [製品フォーム]が開き、以前のカテゴリとしてカテゴリIDが設定されます。

問題は、ユーザーが/ products/newに行くと、カテゴリIDが見つかりません(カテゴリがアドレス要求と共に送信されていないことを確認しているため)。

ユーザーが単に/ products/newアドレスを入力してフォームにアクセスしようとするのを防ぐための方法はありますか?カテゴリページのリンクをクリックせずに新しい製品を作成しようとすると、ユーザーは自宅にリダイレクトされます。

(この質問に関連する)製品コントローラのための私のコード:

def new 
    @product = @category.products.new 
    end 

def set_category 
     @category = Category.find_by(id: params[:category_id]) || Category.find(product_params[:category_id]) 
     rescue ActiveRecord::RecordNotFound 
    end 

private 
    def product_params 
     params.require(:product).permit(:category_id, :title, :description, :image_url, :price) 
    end 

カテゴリショーのページに新製品へのリンク:

%p= link_to t('.add'), new_product_path(category_id: @category) 

メソッド例外ポイントへ:

def product_params 
    params.require(:product).permit(
     :category_id, :title, :description, :image_url, :price) 
end 

ご迷惑をおかけして申し訳ございませんが、ご迷惑をおかけして申し訳ございません。

+0

あなたのルートはどのように見えますか?おそらく '/ products/new'ルートが存在しないようにネストされたリソースが必要になるかもしれません。また、 '@ category'には' find_by'、 'find'、' rescue'は必要ありません。あなたのルートが適切に設定され、 'set_category'が適切なコントローラメソッドにバインドされている場合、' Category.find'呼び出しと通常のRails 'RecordNotFound'処理だけで十分です。 –

+0

現在私は持っています: 'resources:categories' ' resources:products' 別々の行にあります。 do節とカテゴリの下にネストされた製品を設定することを意味すると思いますか? – Isengrim

答えて

1

なぜ、パラメータの存在をチェックする新しいアクションに条件を追加するだけではありませんか?

unless params[:category_id].present? 
    redirect_to somewhere 
end 
+0

私はこれを試しましたが、私はまだ同じ例外を取得しています。これはdef product paramsメソッドを指しています(私は元の投稿に入れます)、 "param is missingまたは値が空です:product" – Isengrim

+1

代わりに 'before_filter'でそれを試してください – toddmetheny

+0

Perfect、worked aチャーム。どうもありがとうございました。 – Isengrim

関連する問題