好的,所以我是Ruby on Rails的新手。我正在使用InstantRails,如果这会有所不同。
这是我的问题 - 我正在尝试将一些条目验证到表单中。如果我使用没有任何验证的表单,那么它工作正常。如果我添加验证,它会完全改变应用程序的行为,但不起作用。
例如,如果我输入数据(没有验证),则表单按钮使用create方法提交数据,该方法将用户重定向回索引。 (表单所在的位置)在一个点或另一个表格中输入的所有内容的列表也在索引上,因此用户可以看到他们最近提交的内容已被添加。 (提交后页面上也会显示flash消息)
但是,如果我做同样的事情,只在模型中没有注释验证,数据库中没有任何内容存储,而是被重定向到索引,Rails尝试将使用重定向到创建页面,而不是存在。
下面是我的控制器,模型和视图的相关部分,以及2个场景的Rails日志。
控制器
def index
@page_subtitle = "Manage Members"
@contacts = Directory.find(:all)
end
def edit
@page_subtitle = "Edit entries"
end
def create
@contact = Directory.new(params[:contact])
if @contact.save
flash[:notice] = 'Contact was successfully added.'
redirect_to :action => "index"
end
end
模型
class Directory < ActiveRecord::Base
validates_presence_of :fname, :lname, :number
validates_numericality_of :number
validates_uniqueness_of :number
validates_length_of :number, :within => 7..10, :message => "Please enter a telephone number that is 7 to 10 digits long. If you require a longer number, please contact support."
end
查看
<b>Add a new member:</b>
<hr>
<% form_for :contact, :url => { :action => "create" } do |f| %>
<table>
<tr>
<td><%= f.text_field :fname %></td>
<td><%= f.text_field :lname %></td>
<td><%= f.text_field :number %></td>
</tr>
<tr height="5px">
</tr>
<tr>
<td><%= f.submit "Add Member" %></td>
</tr>
</table>
<% end %>
<br>
<b>Members currently in database:</b>
<hr>
<table width="100%">
<% for contact in @contacts %>
<tr>
<td><%=h contact.fname %></td>
<td><%=h contact.lname %></td>
<td><%=h contact.number %></td>
</tr>
<% end %>
</table>
<br>
记录(空模型,工作应用程序)
Processing DirectoriesController#create (for 127.0.0.1 at 2009-10-07 23:11:01) [POST]
Session ID: BAh7BzoMY3NyZl9pZCIlODkwZWVmNzgxYzdlZmUxYjdiNWRjNjZiMWYxNGMw%0AMDkiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhh%0Ac2h7AAY6CkB1c2VkewA%3D--043c05ff742c224f3bbc27db8bd8330b0b962740
Parameters: {"commit"=>"Add Member", "contact"=> {"number"=>"9882345688", "lname"=>"Person", "fname"=>"Unique"}, "authenticity_token"=>"467d6a642f0171a166ee093ec05bdef86ba009ac", "action"=>"create", "controller"=>"directories"}
[4;36;1mDirectory Columns (0.003000)[0m [0;1mSHOW FIELDS FROM `directories`[0m
[4;35;1mSQL (0.000000)[0m [0mBEGIN[0m
[4;36;1mDirectory Create (0.001000)[0m [0;1mINSERT INTO `directories` (`updated_at`, `number`, `lname`, `fname`, `created_at`) VALUES('2009-10-07 23:11:01', '9882345688', 'Person', 'Unique', '2009-10-07 23:11:01')[0m
[4;35;1mSQL (0.034000)[0m [0mCOMMIT[0m
Redirected to http://127.0.0.1:3000/directories
Completed in 0.05100 (19 reqs/sec) | DB: 0.03800 (74%) | 302 Found [http://127.0.0.1/directories/create]
记录(模型中的验证,应用程序损坏)
Processing DirectoriesController#create (for 127.0.0.1 at 2009-10-07 23:08:29) [POST]
Session ID: BAh7BzoMY3NyZl9pZCIlODkwZWVmNzgxYzdlZmUxYjdiNWRjNjZiMWYxNGMw%0AMDkiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhh%0Ac2h7AAY6CkB1c2VkewA%3D--043c05ff742c224f3bbc27db8bd8330b0b962740
Parameters: {"commit"=>"Add Member", "contact"=>{"number"=>"8641234567", "lname"=>"Timms", "fname"=>"John"}, "authenticity_token"=>"467d6a642f0171a166ee093ec05bdef86ba009ac", "action"=>"create", "controller"=>"directories"}
[4;36;1mDirectory Columns (0.003000)[0m [0;1mSHOW FIELDS FROM `directories`[0m
[4;35;1mSQL (0.001000)[0m [0mBEGIN[0m
[4;36;1mDirectory Load (0.001000)[0m [0;1mSELECT * FROM `directories` WHERE (directories.number = '8641234567') LIMIT 1[0m
[4;35;1mSQL (0.000000)[0m [0mCOMMIT[0m
Rendering template within layouts/application
Rendering directories/create
Completed in 0.02000 (50 reqs/sec) | Rendering: 0.00400 (20%) | DB: 0.00500 (25%) | 200 OK [http://127.0.0.1/directories/create]
感谢您提供任何帮助!
答案 0 :(得分:1)
@contact.save
返回false,因为验证失败。您的create
操作没有明确说明在这种情况下要呈现的内容,因此Rails正在尝试呈现它想要的内容,即以您的操作命名的模板:create.html.erb
。
传统的做法是重新渲染新模板,以便用户可以解决问题。
def create
@contact = Directory.new(params[:contact])
if @contact.save
flash[:notice] = 'Contact was successfully added.'
redirect_to :action => "index"
else
# validation failed, so give the user a chance to fix it
render :action => "new"
end
end
答案 1 :(得分:0)
我可以猜测validates_uniqueness_of
失败,这意味着@contact.save
返回false,因为你没有告诉Rails在这种情况下使用什么模板,它使用默认模板,它具有相同的名称作为行动。