Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中正确创建自定义操作?_Ruby On Rails_Ruby On Rails 3_Rails Activerecord - Fatal编程技术网

Ruby on rails 如何在Rails中正确创建自定义操作?

Ruby on rails 如何在Rails中正确创建自定义操作?,ruby-on-rails,ruby-on-rails-3,rails-activerecord,Ruby On Rails,Ruby On Rails 3,Rails Activerecord,我正在尝试创建自定义表单,允许管理员打开和关闭用户的用户权限,并将其保存到数据库中。我一定是做错了什么,因为页面生成很好,提交按钮提交给动作fine,但没有任何内容保存到数据库中,它只是再次呈现我的初始视图。有人能看出我做错了什么吗 代码 路线: resources :users do member do get 'assign' put 'assign_update' end end ... 控制器(这种奇怪的做法是试图绕过管理员和其他属性不可访问的事实。这可能是一个

我正在尝试创建自定义表单,允许管理员打开和关闭用户的用户权限,并将其保存到数据库中。我一定是做错了什么,因为页面生成很好,提交按钮提交给动作fine,但没有任何内容保存到数据库中,它只是再次呈现我的初始视图。有人能看出我做错了什么吗

代码

路线:

resources :users do
  member do
    get 'assign'
    put 'assign_update'
  end
end
...
控制器(这种奇怪的做法是试图绕过管理员和其他属性不可访问的事实。这可能是一个混乱。):

视图:

...
<%= form_for(@user, url: { controller: 'users', 
  action: 'assign_update'}, method: 'put') do |f| %>
  <%= f.label :admin, 'Is admin?', class: 'checkbox inline' %>
  <%= f.check_box :admin %>
  <%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
<% end %>
。。。

您应该在模型中使用attr\u accessible,并从参数has中手动选取这些字段,并单独分配它们,确保分配给attr\u accessible声明的字段列表中不包括admin字段

所以

变成

    def assign_update
#      admin_protected = params[:user].delete(:admin)

      @user = User.find(params[:id])
      @user.admin = params[:user][:admin]

      if @user.save
        flash[:success] = "User updated"
        redirect_to users_path
      else
        render 'assign'
      end
    end
问题是,在你的方法中,你仍然在大量分配

要调试实际发生的事情,您应该仔细查看日志文件输出

更新

检查错误列表。 将以下内容添加到表单中

  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this account from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

禁止保存此帐户:

它应该让您和您的用户更清楚地知道什么是错误以及如何修复它

您应该在您的模型中使用attr_accessible,并手动从参数中选取这些字段,并单独分配它们,确保admin字段不包括在分配给attr_accessible声明的字段列表中

所以

变成

    def assign_update
#      admin_protected = params[:user].delete(:admin)

      @user = User.find(params[:id])
      @user.admin = params[:user][:admin]

      if @user.save
        flash[:success] = "User updated"
        redirect_to users_path
      else
        render 'assign'
      end
    end
问题是,在你的方法中,你仍然在大量分配

要调试实际发生的事情,您应该仔细查看日志文件输出

更新

检查错误列表。 将以下内容添加到表单中

  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this account from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

禁止保存此帐户:

它应该能让你和你的用户更清楚地知道什么地方出了问题,以及如何解决问题。因此,请总结一下我们在问题下方评论部分的对话

发现问题在于验证其他用户模型属性。无法保存用户实例,因为在执行
save
方法时验证未通过。结果,Rails只是渲染了assign视图


update\u attribute
方法在没有模型验证或质量分配保护的情况下更新属性。在本例中,
admin
属性符合这两个标准。

因此,总结一下我们在问题下评论部分的对话

发现问题在于验证其他用户模型属性。无法保存用户实例,因为在执行
save
方法时验证未通过。结果,Rails只是渲染了assign视图


update\u attribute
方法在没有模型验证或质量分配保护的情况下更新属性。在这种情况下,
admin
属性符合这两个条件。

当你说“它只是再次呈现我的初始视图”时,你的意思是它呈现分配视图吗?它显示分配视图的内容是的,我假设这是
呈现“分配”
的结果,因为它不保存。url将更改为assign_update,如果我取消选中该框,它将保持未选中状态,但通过控制台检查数据库时,admin属性将保持不变。它确实会将其从params哈希中删除,但也会将其分配给变量
admin_protected
,之后它将不再有用。这是我尝试用稍微不同的方式做这件事时留下的一点东西。即使我改变了它也不起作用。无论哪种方式,变量仍然被赋予相同的值。您是否有机会对用户模型进行验证?我认为对其他用户属性的验证可能会阻止用户实例被更新。要检查这一点,请使用
save
而不是
save
。O等等,我想您可能需要尝试
update\u attribute
方法。当您说“它只是再次呈现我的初始视图”时,您的意思是它呈现分配视图吗?它显示分配视图的内容是,我假设这是
呈现“分配”
的结果,因为它不保存。url将更改为assign_update,如果我取消选中该框,它将保持未选中状态,但通过控制台检查数据库时,admin属性将保持不变。它确实会将其从params哈希中删除,但也会将其分配给变量
admin_protected
,之后它将不再有用。这是我尝试用稍微不同的方式做这件事时留下的一点东西。即使我改变了它也不起作用。无论哪种方式,变量仍然被赋予相同的值。您是否有机会对用户模型进行验证?我认为对其他用户属性的验证可能会阻止用户实例被更新。要检查这一点,请使用
save
而不是
save
。O等等,我想您可能需要尝试
update\u attribute
方法。这是一个有趣的观察。如果问题出在admin属性的mass assignment上,Rails是否应该抛出mass assignment异常,而不是重新呈现assign视图?我在模型中使用的是
attr\u accessible
,admin不在列表中。此外,就我所见,您对代码的更改在功能上并没有太大改变。您仍然在手动设置变量,而不是使用
update\u attributes
,这正是我的代码所做的。您所做的只是将我分配给
@user.admin
的值从变量
admin\u protected
中移出。我应该添加该值,就像我尝试进行的健全性检查一样,它是