0

我有一个需要更新用户对象属性的表单。

以下是我归结为的三个步骤:

  1. 动作“新”需要为表单提供一个对象来操作

  2. 表单需要知道要为哪个对象收集值

  3. 提交表单时,它需要将这些参数发送到更新用户对象的函数

如果这一切都是洁净的,这就是我为实现这一目标所做的努力。

在“新”操作中,我尝试像这样提供用户对象:

      @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. 我正在为我的会话控制器使用设计来创建新用户和处理会话。

  2. 我不相信我对表单助手 options_for_select 的使用被正确使用,因为我还没有为它分配一个一旦选择它应该代表的值,比如“activity_factor”

4

2 回答 2

3

此错误可能来自form_for助手。它试图找出action表单的 URL,所以它观察到它@current_user是 a User,所以调用user_path(@current_user)。如果方法没有定义,那通常意味着没有为 定义路由users#update

尝试运行rake routes并确认该users#update路线存在。如果没有,请添加并重试。

另外,一些注意事项:

  • 如果您要更新现有用户,表单可能应该在edit操作中。该new操作通常保留用于创建全新用户。
  • current_user控制器和视图中都可以访问助手。因此,您可以current_user直接在视图中使用;在控制器中设置它有点多余。只是一件小事。
  • Devise 提供了自己的users#edit表单和users#update操作来更改密码等。我不确定细节,但似乎 Devise 可以轻松覆盖现有表单,只要您要编辑的所有字段都标记为attr_accessible. 如果将这些字段合并到现有的设计表单中是合适的,那可能值得进行一些研究。
于 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| %>

将不会。有了空间,你就会犯这样的错误。

第二个。您的环境不知道user_path

添加到 routes.rb (即使设计的语句存在):

resources :users
于 2012-12-29T23:41:13.800 回答