【问题标题】:How do I define a custom URL for a form confirmation page?如何为表单确认页面定义自定义 URL?
【发布时间】:2013-04-02 20:07:55
【问题描述】:

我正在使用 Rails 创建一个基本的产品登录页面,用户可以在其中输入他们的电子邮件地址,以便在产品发布时收到通知。 (是的,有服务/宝石等可以为我做这件事,但我是编程新手,想自己构建它来学习 Rails。)

成功提交表单后,我想重定向到自定义“/感谢”页面,在该页面中我感谢用户对产品的兴趣(并鼓励他们完成一个简短的调查。)

目前,成功的提交显示在“/invites/:id/”,例如“invites/3”,这是我不想要的,因为它公开了已提交的邀请数量。我想将所有成功的提交重定向到“/thanks”页面。

我曾尝试研究“rails 自定义 URL”,但找不到任何可行的方法。我能找到的最接近的是Stackoverflow post on how to redirect with custom routes,但没有完全理解推荐的解决方案。我也尝试过阅读Rails Guide on Routes,但对此我很陌生,没有看到任何我理解的允许创建自定义 URL 的内容。

我已将我的感谢信息放在“views/invites/show.html.haml”中,希望在成功提交的表单中显示

我的路线文件

resources :invites
root :to => 'invites#new'

我尝试在 routes.rb 中插入:

post "/:thanks" => "invites#show", :as => :thanks

但我不知道这是否可行,也不知道如何告诉控制器重定向到:谢谢

我的控制器(基本上是普通的rails,这里只包含相关操作):

def show
    @invite = Invite.find(params[:id])
    show_path = "/thanks"

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @invite }
    end
  end

# GET /invites/new
# GET /invites/new.json
def new
  @invite = Invite.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @invite }
  end
 end

 # POST /invites
 # POST /invites.json
 def create
   @invite = Invite.new(params[:invite])

   respond_to do |format|
     if @invite.save
       format.html { redirect_to @invite }
       #format.js { render :action => 'create_success' }
       format.json { render json: @invite, status: :created, location: @invite }
     else
       format.html { render action: "new" }
       #format.js { render :action => 'create_fail' }
       format.json { render json: @invite.errors, status: :unprocessable_entity }
     end
   end
 end

似乎创建一个用于显示确认的标准 URL 似乎相对简单。任何有关如何实现这一目标的建议将不胜感激。

【问题讨论】:

    标签: ruby-on-rails confirmation custom-url


    【解决方案1】:

    你可以像这样创建一个路由:

    resources :invites do
      collection do
        get 'thanks'
      end
    end
    

    这还将创建一个名为thanks_invites_path 的路径助手。

    它将位于invites/thanks 路径上,但如果您希望它位于/thanks 上,您可以按照 Jason 提到的方式进行操作:

    get "/thanks" => "invites#thanks", :as => :thanks

    as 部分将生成一个帮助程序来访问该页面:thanks_path

    您需要在控制器中添加一个名为thanks 的额外操作,并将您需要的任何信息放入其中,您还需要一个名为thanks.html.erb 的额外视图

    由于您希望每个人在成功提交后都转到该页面,因此在您的创建操作中您将:

    format.html { redirect_to thanks_invites_path}(或thanks_path),无论你选择什么,当你命名路线时,如果没问题,你可以用rake routes检查它,无论rake routes说什么,只需在末尾添加_path .

    【讨论】:

      【解决方案2】:

      我会在routes.rb 中执行get "/thanks" => "invites#thanks",然后将其添加到您的控制器中:

      def thanks
      end
      

      然后添加一个文件app/views/invites/thanks.html.erb,其中包含您的感谢内容。

      【讨论】:

        【解决方案3】:

        我猜你想在提交表单时执行创建操作后进行重定向。

        只需按以下方式添加redirect_to即可:

        def create
          @invite = Invite.new(params[:invite])
        
          if @invite.save
            ...
            redirect_to '/thanks'
          else
            ...
            redirect_to new_invite_path # if you want to return to the form submission page on error
          end
        end
        

        为了简洁,我省略了一些代码。

        在您的路线中添加:

        get '/thanks', to: "invites#thanks"
        

        将感谢操作添加到您的邀请控制器:

        def thanks
          # something here if needed
        end
        

        并在 app/views/invites 中创建一个 Thanks.html.erb 页面。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-25
          • 2022-07-13
          • 2023-03-29
          • 1970-01-01
          • 2013-11-09
          • 1970-01-01
          • 2011-06-28
          相关资源
          最近更新 更多