0

ユーザー オブジェクトの属性を更新する必要があるフォームがあります。

ここに私が要約した3つのステップがあります:

  1. アクション 'new' は、操作するオブジェクトをフォームに提供する必要があります

  2. フォームは、値を収集するオブジェクトを知る必要があります

  3. フォームが送信されると、これらのパラメーターをユーザー オブジェクトを更新する関数に送信する必要があります。

これがすべてコーシャである場合、これを実現するために私が行ったことは次のとおりです.

「new」アクション内で、次のようにユーザー オブジェクトを提供しようとしました。

      @current_user  = current_user

次に、ビューでは、フォームは次のようになります。

<%= form_for (@current_user) do |f| %>
   <%= f.label :target_bf_pct %>
   <%= f.text_field :target_bf_pct %>

   <%= f.label :activity_factor %>
   <%= options_for_select([['Sedentary (Desk Job)', 1.2],
                                           ['Light Activity (1-3 day a week)', 1.35],
                                           ['Moderate Activity (3-5 days a week)', 1.55],
                                           ['Very Active ( 6-7 days a week)', 1.75],
                                           ['Extremely Active (Atheletic Endurance)', 1.95]])
%>

  <%# f.submit "Post", class:"btn btn-large btn-primary" %> 
<% end %> 

この時点で発生しているエラーは次のとおりです。

undefined method `user_path' for #<#<Class:0x007fd943d00d08>:0x007fd944e5b6c0>

これは、新しいアクション内の @current_user インスタンスに対応するはずのフォーム @current_user オブジェクトを参照しています...

重要な注意点:

  1. セッションコントローラーにdeviseを使用して、新しいユーザーを作成し、セッションを処理しています。

  2. 「activity_factor」のように選択されたときに表すはずの値をまだ割り当てていないため、フォームヘルパー options_for_select の使用が適切に使用されているとは思いません

4

2 に答える 2

3

form_forこのエラーはおそらくヘルパーから発生しています。actionフォームの URL を見つけようとしているので、それが であることがわかり、が@current_user呼び出さUserれますuser_path(@current_user)。メソッドが定義されていない場合は、通常、 にルートが定義されていないことを意味しusers#updateます。

実行してみて、ルートが存在rake routesすることを確認してください。users#updateそうでない場合は、追加してからやり直してください。

また、いくつかの注意事項:

  • 既存のユーザーを更新しようとしている場合、フォームはおそらくeditアクションにあるはずです。アクションは通常、new新しいユーザーを作成するために予約されています。
  • current_userヘルパーは、コントローラーとビューの両方でアクセスできます。したがって、current_userビューで直接使用できます。コントローラーでの設定は少し冗長です。ちょっとしたこと。
  • Devise は、パスワードなどを変更するための独自のusers#editフォームとアクションを提供します。users#update詳細はわかりませんが、編集したいすべてのフィールドがattr_accessible. これらのフィールドを既存の Devise フォームにマージすることが適切である場合は、調査する価値があるかもしれません。
于 2012-12-29T23:10:02.193 に答える
1
<%= form_for(@current_user) do |f| %>
            ^ no space please :)

これは冗談ではありません。

<%= form_for (@current_user) do |f| %>

動作しますが、たとえば:

<%= form_for (@current_user, :class => "user_form") do |f| %>

しない。スペースを使用すると、そのような間違いを犯す可能性があります。

2つ目。あなたの環境はuser_pathを知りません

routes.rb に追加します (devise のステートメントが存在する場合でも):

resources :users
于 2012-12-29T23:41:13.800 に答える