无法使这种形式起作用

时间:2012-12-29 23:04:35

标签: ruby-on-rails

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

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

  1. 动作'new'需要为表单提供操作对象

  2. 表单需要知道要为

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

  5. 如果所有这些都是犹太洁食,那就是我为尝试实现这一目标所做的一切。

    在'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. 我不相信我正在正确使用表单助手options_for_select,因为我还没有给它分配一个它应该代表的值,如“activity_factor”

2 个答案:

答案 0 :(得分:3)

此错误可能来自form_for帮助程序。它试图找出表单的action网址,因此它会发现@current_userUser,因此请调用user_path(@current_user)。如果未定义方法,则通常意味着没有为users#update定义路由。

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

还有一些注意事项:

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

答案 1 :(得分: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