为什么在password_reset的编辑操作中使用hidden_​​field_tag而不是f.hidden_​​field

时间:2018-01-08 16:30:08

标签: ruby-on-rails

我正在做第12章:rails railstutorial.org中的密码重置,我看到了这段代码 app/views/password_resets/edit.html.erb

<h1>Reset password</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user, url: password_reset_path(params[:id])) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= hidden_field_tag :email, @user.email %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Update password", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

PasswordResetsController class PasswordResetsController&lt; ApplicationController中

  def edit
    @user = User.find_by email: params[:email]
  end

  def update
    @user = User.find_by email: params[:email]
    if params[:user][:password].empty?
      add_errors
    elsif @user.update_attributes user_params
      log_in @user
      flash[:success] = t "controllers.password_reset.success"
      redirect_to @user
    else
      render :edit
    end
  end

end

重置此类链接:http://localhost:3000/password_resets/DCxf-6H4fyBf32QrW-d2Zg/edit?email=trag08%40gmail.com 点击链接,路由呼叫操作edit并收到电子邮件至params [:email]并查看edit.html.erb并将电子邮件发送到hiddren字段。为什么在此代码中,他们不会使用f.hidden_field :email, @user.email

我尝试使用f.hidden_field :email, @user.email并在控制器中编辑更新操作。

def update
        @user = User.find_by email: params[:user][:email]
        if params[:user][:password].empty?

Rails rase错误:undefined method合并&#39; for&#34; xxx@gmail.com":String`,它没有得到用户。为什么这样?

1 个答案:

答案 0 :(得分:2)

正如您在教程示例中看到的那样,<%= hidden_field_tag :email, @user.email %>并未创建params[:user]中可用的参数。

创建params[:email]

中可用的参数

当他们拨打他们使用的电子邮件时:

@user = User.find_by email: params[:email]

您使用:

@user = User.find_by email: params[:user][:email]

我建议您查看您正在使用的rails helper标记创建的确切内容。请参阅Form Tag Helpers