我正在使用Ruby on Rails 2.3.8并且我有一个注册表单,其中我收到如下参数:/registration/4
,其中4是推荐用户的用户的ID即将在网站上注册。
问题是,如果在用户提交注册时(表单呈现给控制器users
,操作create_particular
)验证失败,则网站将重定向到/users/create_particular
,因此我丢失了之前的值为4的参数。此外,我希望用户保持相同的网址,即/registration/4
我该怎么做?
答案 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] %>