【问题标题】:Form_for Gives Wrong Outputs After render :action=>'edit'Form_for 在渲染后给出错误的输出:action=>'edit'
【发布时间】:2011-09-22 21:14:05
【问题描述】:

我想这个问题可能以前被问过,但老实说我不知道​​如何搜索它。

基本上,当我在控制器的更新操作中执行渲染 :action => 'edit' 时,视图会以某种方式输出表单,就好像它是一个 :action => 'new' 页面。

form_for 给出了错误的操作,而 f.submit 给出了错误的按钮文本(它给出了创建而不是更新)

编辑:

控制器的相关部分

def edit
  @user = User.find_by_email(current_user.email)
end

def update
  old_password=params[:user].delete(:old_password)
  @user=User.new(params[:user])

  if User.find_by_email(@user.email).valid_password?(old_password)
    logger.info 'Valid old password'
  else
    flash[:notice]='Invalid current password'
    render :action=>'edit'
  end
end

【问题讨论】:

  • 我们需要一些代码来诊断:)
  • 感谢回复,其实我刚刚解决了,但是还是没有意义...
  • 我知道我有 @user=User.new(params[:user]),但它不应该在渲染后被覆盖:action=>'edit'?
  • 我认为,form_for 不在乎你在渲染什么。它检查@user 的saved 标志并根据其值构建表单。
  • 我对此有疑问,因为@user = User.find_by_email(current_user.email) 在渲染后执行:action => 'edit',不应该将标志设置为“已经之前保存过”?

标签: ruby-on-rails view form-for


【解决方案1】:

正如 cmets 中所讨论的,@bassneck 是正确的 - 当您渲染编辑视图时,form_for 调用会查看对象是否被持久化 (@user.persisted?)。这在很多情况下都有好处,即能够将一段表单代码用于新视图和编辑视图(我通常会使用部分_form.html.erb 来用于这两种情况)。

但在您的情况下,它不会导致所需的行为 - 所以您需要做的是确保您使用的是相关的用户对象。如果要更新用户,@user 应该是您要更新的对象。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2014-02-13
    • 2019-08-07
    • 2011-01-14
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多