验证失败时如何保持相同的URL

时间:2011-02-02 21:16:37

标签: ruby-on-rails

我正在使用Ruby on Rails 2.3.8并且我有一个注册表单,其中我收到如下参数:/registration/4,其中4是推荐用户的用户的ID即将在网站上注册。

问题是,如果在用户提交注册时(表单呈现给控制器users,操作create_particular)验证失败,则网站将重定向到/users/create_particular,因此我丢失了之前的值为4的参数。此外,我希望用户保持相同的网址,即/registration/4

我该怎么做?

5 个答案:

答案 0 :(得分:3)

然后你应该重写你的create方法。您应该使用redirect_to :back代替render :action

<强> UPD

def new
  @word = Word.new(params[:word])
  @word.valid? if params[:word]
end

def create
  @word = Word.new(params[:word])
  if @word.save
    redirect_to @word
  else
    redirect_to new_word_path(:word => params[:word] )
  end
end

看起来很脏,但这只是一个划痕

UPD 2

这实际上不是最好的解决方案,但它有效

# routes.rb
match 'words/new' => 'words#create', :via => :post, :as => :create_word

# words_controller
def new
  @word = Word.new
end

def create
  @word = Word.new(params[:word])

  respond_to do |format|
    if @word.save
      format.html { redirect_to(@word, :notice => 'Word was successfully created.') } 
    else
      format.html { render :action => "new" }
    end
  end
end

# views/words/new.html.erb
<%= form_for(@word, :url => create_word_path) do |f| %>
  ...
<% end %>

答案 1 :(得分:2)

提交到当前URI(例如action =“”)。提交有效时,重定向。 POST-&gt;重定向 - &gt; GET是一个好习惯。

答案 2 :(得分:0)

从头到尾:

编辑您的控制器(registrations_controller.rb文件)。默认情况下,Create方法包含以下代码:

if @registration.save
        format.html {  }
        format.xml {  }
      else
        format.html {  }
        format.xml { }
      end

在括号中添加redirect_to (:back)else format.html{}

答案 3 :(得分:0)

好的我通过执行以下操作解决了问题:

1)我使用相同的路径创建了两条路线,但是使用了不同的条件方法(一条是发布,另一条是设置)

2)我更改了表单以便发布到上面定义的POST操作

3)我添加了render =&gt; :验证失败时的my_action

所以这就是它。

非常感谢您的帮助。

答案 4 :(得分:0)

隐藏的字段。该用户ID参数有一个名称,您可以通过该名称在控制器中提取它,对吗?因此,只需将该值放在同名的隐藏字段中,它就可以在往返过程中存活下来。

例如:

<%= hidden_field_tag :referring_user_id, params[:referring_user_id] %>