我有一个表单,我希望用户回答每个问题,所以我添加了模型级验证。 我认为如果它通过验证,它应该重定向到另一个页面调用“方案”(我还没有完成它的视图所以它应该显示模板丢失)。如果它没有通过验证,它应该再次渲染到新页面,保留已填写的信息,并显示验证错误。
但不管我填写了那些字段,当我点击提交按钮时,它总是显示索引页面而不是“新”或“方案”(应该是模板缺失)。似乎忽略了我在动作“创造”中所写的内容,而“创造”从未被调用过。
我使用rails c并插入新记录来测试验证。它运行良好,所以我猜我的模型和验证没有问题。
我也尝试将form_for直接重定向到“scenario”,以确保它适用于form_for,并且它确实显示我没有模板,因此“创建”本身可能存在一些问题。我真的不知道出了什么问题。
<%= form_for @subject, :url => { :controller => 'appstores', :action => 'scenario' } do |f| %>
有一个类似的问题:rails form_for never invokes the create controller action to use redirect_to。 我曾尝试使用“respond_with”,而不是工作。并且还检查我的控制器是否名为appstroes_controller.rb,其中包含以下资源:routes.rb中的appstores。
我使用rails 4.2.4,ruby 2.0.0和bootstrap 3,不知道版本是否会导致这些问题。
任何帮助将不胜感激,谢谢!
应用程序/控制器/ appstores_controller.rb
class AppstoresController < ApplicationController
def index
end
def new
@subject = Subjectinfo.new
end
def create
@subject = Subjectinfo.new(params[:subjectinfo])
if @subject.save
redirect_to :action => "scenario"
else # if not pass DB validation
render :action => :new
end
end
def scenario
end
end
应用程序/视图/ appstores / new.html.erb
<%= form_for @subject, :url => { :controller => 'appstores', :action => 'create' } do |f| %>
<form class="form-horizontal">
<div class="form-group">
<%= f.label :username, "User Name:", :class=>"control-label", :for=>"username" %>
<% if @subject.errors[:username].presence %>
<span class="model-error"><%= @subject.errors[:username].join(", ") %></span>
<% end %>
<%= f.text_field :username, :autocomplete=>"off", :placeholder=>"User Name", :class=>"form-control", :id=>"username" %>
</div>
<div class="form-group">
<%= f.label :mobile_user, "Are you a mobile device user?", :class=>"control-label", :for=>"mobile_user" %>
<% if @subject.errors[:mobile_user].presence %>
<span class="model-error"><%= @subject.errors[:mobile_user].join(", ") %></span>
<% end %>
<div class="radio radio-primary">
<%= f.radio_button :mobile_user, "1", :id=>"mobile_user_1" %>
<%= f.label :mobile_user, "Yes", :class=>"control-label", :for=>"mobile_user_1" %>
</div>
<div class="radio radio-primary">
<%= f.radio_button :mobile_user, "0", :id=>"mobile_user_0" %>
<%= f.label :mobile_user, "No", :class=>"control-label", :for=>"mobile_user_0" %>
</div>
</div>
<div class="text-center">
<%= f.submit "NEXT", :class => "btn btn-default btn-outline btn-lg" %>
</div>
</form>
<% end %>
app / modle / subjectinfo.rb
(为了支持rails 4的“attr_accessible”,我在我的Gemfile中放了“gem'en protected_attributes'”)
class Subjectinfo < ActiveRecord::Base
validates_presence_of :username, :mobile_user
attr_accessible :username, :mobile_user
end
配置/ routes.rb中
AppStore::Application.routes.draw do
match ':controller(/:action(/:id(.:format)))', :via => :all
root :to => "appstores#index"
resources :appstores
get "appstores/scenario"=>"appstores#scenario"
end
rake routes
Prefix Verb URI Pattern Controller#Action
/:controller(/:action(/:id(.:format))) :controller#:action
root GET / appstores#index
appstores GET /appstores(.:format) appstores#index
POST /appstores(.:format) appstores#create
new_appstore GET /appstores/new(.:format) appstores#new
edit_appstore GET /appstores/:id/edit(.:format) appstores#edit
appstore GET /appstores/:id(.:format) appstores#show
PATCH /appstores/:id(.:format) appstores#update
PUT /appstores/:id(.:format) appstores#update
DELETE /appstores/:id(.:format) appstores#destroy
appstores_rfscenario GET /appstores/rfscenario(.:format) appstores#rfscenario
顺便说一句,这是我在终端上看到的,这是我填写所有字段的时间。
Started POST "/appstores" for 127.0.0.1 at 2015-11-03 22:25:54 +0800
Processing by AppstoresController#index as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"7WV4Iw/0uHNSnuXpr8qa39oFEF9gZfKm8EyHGQna0o0=", "subjectinfo"=>{"username"=>"a1", "mobile_user"=>"1"}, "commit"=>"NEXT"}
Rendered appstores/index.html.erb within layouts/application (12.6ms)
Completed 200 OK in 91ms (Views: 88.0ms | ActiveRecord: 0.0ms)
这是我将它们留空的时候,但无论它是否为空白,它总是呈现为索引......
Started POST "/appstores" for 127.0.0.1 at 2015-11-03 22:25:54 +0800
Processing by AppstoresController#index as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"7WV4Iw/0uHNSnfuXpr8qa39oFEF9gZfKm8EyHGQna0o0=", "subjectinfo"=>{"esearch"=>""}, "commit"=>"NEXT"}
Rendered appstores/index.html.erb within layouts/application (12.6ms)
Completed 200 OK in 91ms (Views: 88.0ms | ActiveRecord: 0.0ms)
答案 0 :(得分:1)
从match ':controller(/:action(/:id(.:format)))', :via => :all
文件中删除行routes.rb
,不再使用它。此模式与任何路线匹配,并且位于第一个位置,因此您文件中的其他路径根本没有机会。