在另一个控制器rails中更新用户

时间:2014-01-22 10:39:44

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-3.1

在我的rails应用程序中,如果我转到localhost:3000 / users / edit以更新用户

<h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
  <%= devise_error_messages! %>

  <div><%= f.label :email %><br />
  <%= f.text_field :email%></div>


  <div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
  <%= f.password_field :password, :autocomplete => "off" %></div>

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>

  <div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= f.password_field :current_password %></div>

  <div><%= f.submit "Update" %></div>
<% end %>

<h3>Cancel my account</h3>

<p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %></p>

<%= link_to "Back", :back %>

没关系,但是如果我将这段代码((或渲染此视图)移动到另一个控制器的另一个视图,它将会出现错误:“未定义的局部变量或方法”资源“#&lt;#:0x3b27478&gt ;” 我不知道如何解决它,任何帮助真的很感激。

1 个答案:

答案 0 :(得分:1)

resource是由Devise gem设置的变量。为了将上述代码移到其他地方,这意味着必须自己设置resource变量。

基本上,rails form_for想要获取您要创建/编辑的对象的实例。

<%= form_for instance_object ...

在您的情况下,您需要首先获取要编辑的用户(或使用current_user),然后将其提供给form_for辅助方法:

<%= form_for current_user ...

或首先在控制器中设置@user实例变量:

def new
  @user = User.new
end

def edit
  @user = User.find(some_id)
end

然后在你看来:

<%= form_for @user ...

不要忘记用实例变量替换所有resource次出现。