簡體   English   中英

Rails驗證條件重定向

[英]Rails validation conditional redirect

我目前遇到Rails如何執行和響應驗證結果的問題。 我有一個用戶注冊表。 用戶可以在兩個不同的地方點擊此表單。 他們可以從主頁或來自users/new的表單。 兩種形式都會發布到同一個地方,因為我試圖讓它干涸。

users/new頁面按預期工作。 如果用戶有驗證問題,它將返回並填充表單。 我在哪里遇到問題在主頁上。 如果用戶有驗證問題,它現在會重定向到users/new頁面。 我更喜歡在主頁上將用戶返回到同一頁面並在那里顯示驗證結果。 控制器中是否有一種方法可以重定向到用戶所在的表單?

def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      format.html { redirect_to(@user, :notice => 'User was successfully created.') }
      format.xml  { render :xml => @user, :status => :created, :location => @user }
    else
      format.html { render :action => "new" } # I'm thinking I can do something here?
      format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
    end
  end
end

我試圖更改render :action => 'new'行重定向到用戶url,但它沒有工作。 有什么我想念的嗎?

首先,我會將querystring參數添加到它發布到的URL中,控制器和它來自的動作是這樣的:

# Using form_tag
<%= form_tag user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %>

# Using form_for
<%= form_for @user, :url => user_path(@user, :controller_name => controller.controller_name, :action_name => controller.action_name) do %>

然后,您可以在控制器的create動作中更新該行,如下所示:

render '#{params[:controller_name]}/#{params[:action_name]}'

更新

我剛剛意識到使用上面的代碼,將在第一次驗證失敗時呈現正確的視圖,但如果驗證第二次失敗,它將嘗試呈現users/create視圖。 如果這是您要采用的路由,則不應在視圖中使用controller.controller_name等,而是正確分配@controller_name並使用該變量。 然而,這只會增加Xavier的“矯枉過正”評論。

藝術在正確的軌道上,但您不能使用重定向,因為您需要在控制器中設置的實例變量@user ,它將在新的HTTP請求中丟失(因為任何請求都是由新的,干凈的處理控制器實例)。

但是您可以自己使用引用者信息,並使用它來選擇要呈現的正確頁面:

render :action => (request.referer =~ /\/users\/new/)? :new : :index

注意:我在發帖時彈出另一個答案,建議在表單中添加舊的控制器/操作字段,但這對我來說似乎有點過分了 - 您已經在request.referer所需的所有信息。

希望有所幫助!

嘗試redirect_to :back
它是redirect_to(request.env["HTTP_REFERER"])的簡寫redirect_to(request.env["HTTP_REFERER"])

哎呀,它只適用於成功。 抱歉

好吧,那么你必須在塊中(在format.html之后)檢查他來自哪里(通過查看request.env [“HTTP_REFERER”])並呈現相應的動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM