0

私は単純な問題で立ち往生しています。form タグと select タグがあります。変更時に、ユーザーが選択したカテゴリに移動するようにします。

このフォームはヘッダーで利用でき、カテゴリーコントローラーで change_category アクションを定義しました。

これがどのように見えるかです: -

application.html.haml

=render :partial => "categories/category"

カテゴリ_コントローラー.rb

def change_category
  @categories = Category.all
  @category_name = params[:main]
  @category = Category.find(params[:main])
end

_category.html.haml

=form_tag(change_category_category_path(@category),:method => "get", :remote => true) do
    =select_tag(:main, options_for_select(Category.all.collect {|p| [p.name,p.id]}), :prompt => "Select Category", :onchange => 'this.form.submit();')

route.rb

resources :categories do
    member do
      get :change_category
    end
  end

エラー :-

No route matches {:action=>"change_category", :controller=>"categories", :id=>nil}

問題は @category が nil と評価されることだと思います。どうすればこれを解決できますか?

4

2 に答える 2

1

あなたの問題は、レイアウトによって部分的にレンダリングされるとき@categoryに設定されない可能性があることです。さらに、ユーザーが変更するカテゴリをドロップダウンで選択する必要があるため、何を設定すればよいかわかりません。

代わりにコレクション アクションを作成change_categoryします (少し読みやすくするために、アクションの名前も変更しました)。

resources :categories do
  collection do
    get :change
  end
end

そして、フォームが次のように変わるはずです

= form_tag(change_categories_path(),:method => "get", :remote => true) do
  = select_tag(:main, ...)
于 2012-07-25T11:59:47.503 に答える
0

まず、ルーティング ルールを確認する必要があります。アプリケーションのルート ディレクトリに移動し、「rake routes」と入力すると、ルーティング ルールを確認できます。

 metrics     GET        /metrics(.:format)             metrics#index
             POST       /metrics(.:format)             metrics#create
 new_metric  GET        /metrics/new(.:format)         metrics#new
 edit_metric GET        /metrics/:id/edit(.:format)    metrics#edit
 metric      GET        /metrics/:id(.:format)         metrics#show
             PUT        /metrics/:id(.:format)         metrics#update
             DELETE     /metrics/:id(.:format)         metrics#destroy
  1. 「リソース」を使用してルーティング規則を生成すると、常に「:id」が含まれますが、それをフィードしていないようです。

ソリューション 1. カスタム ルーティング ルールを作成します。ここで方法を見つけることができますhttp://guides.rubyonrails.org/routing.html

解決策 2. フォームに「id」入力タグを追加して、コントローラーに :id を送信します。次に、「params[:main]」=>「params[:id]」を変更します

于 2012-07-25T08:39:37.933 に答える