[英]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.