【问题标题】:Hidden attribute not populating field in form for Rails 3.2隐藏属性未填充 Rails 3.2 表单中的字段
【发布时间】:2016-05-01 11:44:05
【问题描述】:

我正在实现一个邀请系统,我希望 new user form 在表单上的电子邮件地址字段中预填充用户的电子邮件地址(最终,我将重构它,使其不是 form_field),以便用户无需输入所有信息,只需输入密码即可。

我在 users.rb 模型中创建了 getter/setter 方法,如下所示:

  def invitation_token
    invitation.invitation_token if invitation
  end
  def invitation_token=(invitation_token)
    self.invitation = Invitation.find_by_invitation_token(invitation_token)
  end

邀请模型

class Invitation < ActiveRecord::Base

  #--== ASSOCIATIONS
  belongs_to :sender, :class_name => 'User'
  has_one :recipient, :class_name => 'User'
  #--== CALLBACKS
  before_create :generate_token
  before_create :recipient_is_not_registered
  before_create :decrement_sender_count, :if => :sender
  #--== VALIDATIONS
  validates_presence_of :recipient_email
  #validate :recipient_is_not_registered
  validate :sender_has_invitations, :if => :sender
  #--== METHODS
  private
    def recipient_is_not_registered
      if User.find_by_email(recipient_email)
        false
      else
        true
      end
    end

    def sender_has_invitations
      unless sender.invitation_limit > 0
        redirect_to root_url
      end
    end

    def generate_token  #TODO: MOVE to lib/generate_token.rb
      self.invitation_token = Digest::SHA1.hexdigest([Time.now, rand].join)
    end

    def decrement_sender_count
      sender.decrement! :invitation_limit
    end

end

用户控制器

class UsersController < ApplicationController
  def new
    @user = User.new(:invitation_token => params[:invitation_token])
    @user.email = @user.invitation.recipient_email if @user.invitation
  end

  def create
    @user = User.new(user_params)
    if @user.save
      session[:user_id] = @user.id
      redirect_to root_url, notice: "Thank you for signing up!"
    else
      render "new"
    end
  end

 ...

  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation, :admin)
  end
end

views/users/_form.html.erb

<%= form_for @user do |f| %>  

  <%= f.hidden_field :invitation_token %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :password %><br />
    <%= f.password_field :password %>
  </div>
  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %>
  </div>
  <div class="field">
    <%= f.check_box :admin %>
    <%= f.label :admin %>
  </div>
  <div class="actions"><%= f.submit %></div>
<% end %>

我正在关注 Ryan Bates 的 RC#124 - Beta 邀请,但被困在这里。他的代码不会产生错误,所以我应该提到这是一个 Rails 3.2.18 应用程序。

当我重新加载表单时,表单中没有填充用户的电子邮件。相关日志显示:

Started GET "/signup.914823d28d07b747213ec3de47f89ad537169e34" for 127.0.0.1 
at 2016-04-30 20:24:47 -0600
Processing by UsersController#new as 
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."auth_token" = 'rOHiKmDcceytxi_t151YIQ' LIMIT 1
  Invitation Load (0.0ms)  SELECT "invitations".* FROM "invitations" WHERE "invitations"."invitation_token" IS NULL LIMIT 1
  Rendered users/_form.html.erb (5.0ms)
  Rendered users/new.html.erb within layouts/application (6.0ms)
Completed 200 OK in 102.0ms (Views: 25.0ms | ActiveRecord: 3.0ms)

所以似乎没有传入invitation_token,因为日志显示它为NULL。

我已经从上到下检查了 RC 代码,但无法找出为什么它没有通过。

任何帮助将不胜感激。谢谢。

更新:视图源的输出是:

&lt;input id="user_invitation_token" name="user[invitation_token]" type="hidden" /&gt;,所以它没有被传递。

【问题讨论】:

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


    【解决方案1】:

    通过传递value: 键设置隐藏字段的值:

    <%= f.hidden_field :invitation_token, value: some_value %>
    

    【讨论】:

    • 练习的重点是从 url 填充 invitation_token,例如:http://localhost:3000/signup/914823d28d07b747213ec3de47f89ad537169e34 这不是从通过电子邮件发送给用户的 URL 设置的。
    • 您在 new 操作中将邀请令牌分配给用户。那么为什么不&lt;%= f.hidden_field :invitation_token, value: @user.invitation_token %&gt;?不然&lt;%= f.hidden_field :invitation_token, value: params[:invitation_token] %&gt;呢?
    • 这行得通,但还有另一个问题。在我的代码中,它生成的 URL 为http://localhost:3000/signup.1b344bd1ed23ea367728239496339074fc859721。这行不通。为了使填写工作按预期工作,URL 需要删除“.”。在“注册”之后并将其替换为“/”。我看不到它把句点放在斜杠字符的位置。
    • 这是因为生成 http://localhost:3000/signup.1b344bd1ed23ea367728239496339074fc859721 的任何路由在您的路由中都缺少标识符(例如 /signup/:token/)
    • 这是我设置的路线...get 'signup/:invitation_token', to: 'users#new', as: 'signup'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多