带验证的form_for未正确调用“创建”操作

时间:2015-11-03 15:41:02

标签: ruby-on-rails ruby forms twitter-bootstrap validation

我有一个表单,我希望用户回答每个问题,所以我添加了模型级验证。 我认为如果它通过验证,它应该重定向到另一个页面调用“方案”(我还没有完成它的视图所以它应该显示模板丢失)。如果它没有通过验证,它应该再次渲染到新页面,保留已填写的信息,并显示验证错误。

但不管我填写了那些字段,当我点击提交按钮时,它总是显示索引页面而不是“新”或“方案”(应该是模板缺失)。似乎忽略了我在动作“创造”中所写的内容,而“创造”从未被调用过。

我使用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)

1 个答案:

答案 0 :(得分:1)

match ':controller(/:action(/:id(.:format)))', :via => :all文件中删除行routes.rb,不再使用它。此模式与任何路线匹配,并且位于第一个位置,因此您文件中的其他路径根本没有机会。