我有一个需要更新用户对象属性的表单。
以下是我归结为的三个步骤:
动作'new'需要为表单提供操作对象
表单需要知道要为
提交表单时,需要将这些参数发送到更新用户对象的函数
如果所有这些都是犹太洁食,那就是我为尝试实现这一目标所做的一切。
在'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实例对应...
重要提示:
我在会话控制器中使用devise来创建新用户并处理会话。
我不相信我正在正确使用表单助手options_for_select,因为我还没有给它分配一个它应该代表的值,如“activity_factor”
答案 0 :(得分:3)
此错误可能来自form_for
帮助程序。它试图找出表单的action
网址,因此它会发现@current_user
是User
,因此请调用user_path(@current_user)
。如果未定义方法,则通常意味着没有为users#update
定义路由。
尝试运行rake routes
并确认users#update
路由存在。如果没有,请添加并重试。
还有一些注意事项:
edit
操作中。 new
操作通常用于创建全新用户。current_user
帮助程序。因此,您可以直接在视图中使用current_user
;在控制器中设置它有点多余。只是一件小事。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