为什么Rails在URL中的查询字符串之前放置一个句点(点)而不是问号?

时间:2016-02-29 20:19:22

标签: ruby-on-rails railstutorial.org mailer

Rails正在生成带有句点的帐户激活网址,而不是问号。我在邮件程序预览和rails日志中都看到了这种情况。示例链接:

http://localhost:3000/account_activations/Cm4OyFOwosBcGZ67qg49nQ/edit.example@railstutorial.org

来自routes.rb:

resources :account_activations, only: [:edit]

来自users_controller.rb:

  def create
    @user = User.new(user_params)
    if @user.save
      UserMailer.account_activation(@user).deliver_now
      flash[:info] = "Please check your email to activate your account."
      redirect_to root_url
    else
      render 'new'
    end
  end

来自account_activation.html.erb:

<%= link_to "Activate", edit_account_activation_url(@user.activation_token, @user.email) %>

来自user.rb(创建和分配摘要的方法):

def create_activation_digest
  self.activation_token = User.new_token
  self.activation_digest = User.digest(activation_token)
end

来自user_mailer_preview.rb:

  def account_activation
    user = User.first
    user.activation_token = User.new_token
    UserMailer.account_activation(user)
  end

2 个答案:

答案 0 :(得分:4)

url_route只需要一个参数:id。你想要做的是:

edit_account_activation_url(@user.activation_token, email: @user.email)

这会让您在控制器中使用params[:id]params[:email]

答案 1 :(得分:2)

原因是每个资源丰富的url_helper实际上都需要n或n + 1个参数(其中n是路由中的一些命名参数),最后一个参数是路由的格式:

user_path(@user, :json)  #=>  /users/1.json

(实际上签名只是url_helper(*args),从帮助者内部抛出了错误的arity异常)

如果你想添加额外的get参数,你需要传递一个额外的哈希,如nzfinab所述:

user_path(@user, hello: :there) #=> /users/1?hello=there