0

「me」/me セクションの下にいくつかのルートの名前空間を作成して、この名前空間の下にすべてのユーザー プロファイル/アカウント ベースのものを配置して、よりクリーンなルーティングを実現しようとしています。

これにアプローチする最良の方法は何ですか?デフォルトの REST ルーティング ( profiles/1/edit ) を書き換えると、フォームが更新されないなどの問題がいくつか発生することがわかりました。

ルート

get "/me/profile"              => "profiles#show", :as => :my_profile
get "/me/profile/:what"        => "profiles#edit", :as => :my_profile_edit
post "/me/profile/:what"       => "profiles#edit"

プロフィールコントローラー

def edit
  @profile      = current_user.profile
  if ["basics", "location", "details", "photos"].member?(params[:what])
    render :action => "edit/edit_#{params[:what]}"
  else
    render :action => "edit/edit_basics"
  end
end

def update
  @profile        = current_user.profile
  @profile.form   = params[:form]
  respond_to do |format|
    if @profile.update_attributes!(params[:profile])
      format.html { redirect_to :back, :notice => t('notice.saved') }
    else
      format.html { render action => "/me/profile/" + @profile.form }
    end
  end
end

上記のように感じた場合は、REST の原則に反して非常に悪い方向に進んでいます。望ましい結果をより良い方法で達成するにはどうすればよいでしょうか?

4

1 に答える 1

1

そんなに REST に固執したいのであれば、 を:whatGET params ハッシュに移動することをお勧めします。次に、このようにルートを書き換えることができます

scope "/me" do
  resource :profile, :only => [:show, :edit, :update]

したがって、編集ページを次のようにアドレス指定するよりもprofile_edit_path(:what => "details")

コードについてさらにいくつかのことを結合します。

  • あなたはに変更update_attributesする必要がありますupdate
  • リダイレクト :back を使用しないでください。これは js バック リンクをレンダリングし、実際のリクエストを実行しないため、実際の変更は表示されません。
  • あなたはに変更render action =>する必要がありますrender :template =>
  • params[:profile]strong_params を使用していない限り、更新ステートメントで使用しないでください。フォームから許可するパラメーターを指定する必要があります。大量割り当てからの保護のために行われます。

Rails 4 の CodeSchool チュートリアルを実際にチェックする必要があると思います。

于 2013-09-14T19:45:06.303 に答える