【问题标题】:Ruby Rails Only some parameters are passed to the controllerRuby Rails 只有一些参数被传递给控制器
【发布时间】:2012-05-05 05:21:31
【问题描述】:

我有大约 60 个字段的单一形式的用户属性,通过在一个页面上切换隐藏的 div 来单独显示。更新其他人的个人资料时,所有字段都会按预期更新。更新当前登录的配置文件 (current_user) 时,只有大约 40 个字段会更新。以下是我对 current_user 配置文件更新方法的观察:

当直接在@user = User.find(params[:id]) 之后设置断点并查看传递的参数时,60 个表单字段参数中甚至只有大约 40 个存在。存在的会按预期更新,显然不存在的不会更新。

关于可能导致这种奇怪行为的任何线索?

示例:users/_form.erb 上许多行为不端的表单字段之一

<%= f.text_field :street_address, :placeholder => 'address..'  %>

users_controller.rb 中的更新方法

# UPDATE
  def update   
    @user = User.find(params[:id])
    breakpoint_set = on_this_line
    respond_to do |format|     
      if @user.update_attributes params[:user]
        format.html do
          redirect_to("/users", :notice => 'User Profile was successfully updated.')
          format.xml  { head :ok }
        end
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

【问题讨论】:

  • 这是您的示例代码中的一种类型吗?
  • 那是一个错字,我把它改成了 f。但不幸的是,这不是问题。
  • 其他我尝试无济于事的事情是在所有字段上使用 attr_accessible 并重新启动服务器。我有点没主意了。
  • 每次执行此操作时结果是否保持不变?也就是说,正确更新的属性下次不会更新了吗?我想看看行为是否一致。
  • 是的,所有行为不端的字段都是一致的,每次都是相同的。那些有效的,总是有效的。

标签: ruby-on-rails ruby


【解决方案1】:

如果“当前登录用户”只是一个 User 对象,那么我怀疑您看到了缓存的副作用。

如果您有两个表示同一记录的 Active Record 对象,并且它们对该记录的状态存在分歧,则可能会发生不同类型的问题。例如;

@u1 = User.find logged_in_user_id
@u2 = User.find logged_in_user_id

@u1.update_attributes :username => "root"

@u2.username   # old username
@u2.reload
@u2.username   # "root"

确保这不会发生在您身上。

【讨论】:

  • 事实证明,这不是问题,但你提出了一个我从未想过的有趣场景。鉴于我可能会遇到这种情况,鉴于我的一些代码,将这种情况暴露出来特别有趣。谢谢!
【解决方案2】:

检查参数是否从客户端移植到控制器。您可以在 Firefox + Firebug 控制台中查看。

并检查是否每个参数都在用户哈希下,因为缺少的参数可能不在同一个用户哈希中(Rails 控制器正在查看)。

【讨论】:

  • 将我指向这个方向导致了决心。发生的事情是通过在用户表单内部呈现部分的嵌套表单,如 'users/address' %> 。尽管这个表单需要是一个表单,因为它在其他地方使用,但我在我做的地方渲染是不合适的。
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多