2013-10-06 59 views
0

我已经创建了一个简单的用户MVC,用户可以在其中输入他们的电子邮件以加入我们的邮件列表。它似乎工作得很好。唯一的问题是我想在主页上显示视图。我想简单地把<%在我的index.html.erb页=渲染“用户/新”%>,但它不断给我一个错误错误地设置路由?

Missing partial users/new with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb,  :builder, :coffee]}. Searched in: 
    * "/Users/jeff/Desktop/selfstarter/app/views" 
Extracted source (around line #4): 

1: <%= render 'preorder/homepage/show_dont_tell' %> 
2: <%= render 'preorder/homepage/key_points' %> 
3: <%= render 'preorder/homepage/other_points' %> 
4: <%= render 'users/new' %> 
5: 
6: <%#<%= render 'preorder/homepage/middle_reserve' %> 
7: <%#<%= render 'preorder/homepage/faqs' %> 

我听说过,我可能想使之成为一个部分,但我如何将我的意见转换为可用的部分?

这是我的路线文件

Selfstarter::Application.routes.draw do 
    resources :users 

    match '/signup', to: 'users#new' 
    get "users/new" 
    get "static_pages/about" 
    get "static_pages/FAQ" 

    root :to => 'preorder#index' 
    match '/preorder'    => 'preorder#index' 
    get 'preorder/checkout' 
    match '/preorder/share/:uuid' => 'preorder#share', :via => :get 
    match '/preorder/ipn'   => 'preorder#ipn', :via => :post 
    match '/preorder/prefill'  => 'preorder#prefill' 
    match '/preorder/postfill'  => 'preorder#postfill' 



end 

这是我的users_controller文件

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 
    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     UserMailer.registration_confirmation(@user).deliver 
     flash[:success] = "Welcome to the Island Mailing List!" 
     redirect_to root_path 
    else 
     render 'new' 
    end 
    end 
end 

这是我的用户/ new.html.erb文件

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 
    <link rel="shortcut icon" href="../../assets/ico/favicon.png"> 

    <title>Jumbotron Template for Bootstrap</title> 

    <!-- Bootstrap core CSS --> 
    <link href="../../dist/css/bootstrap.css" rel="stylesheet"> 

    <!-- Custom styles for this template --> 
    <link href="jumbotron.css" rel="stylesheet"> 

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> 
    <!--[if lt IE 9]> 
     <script src="../../assets/js/html5shiv.js"></script> 
     <script src="../../assets/js/respond.min.js"></script> 
    <![endif]--> 
    </head> 

    <body> 
<div class= "jumbotron"> 
    <div class="container"> 
     <div class="row"> 
       <div class="col-lg-6"> 
    <%= form_for(@user) do |f| %> 
<%= render 'shared/error_messages' %> 

     <div class="input-group"> 
     <%= f.text_field :email, class: "form-control", placeholder: "[email protected]" %> 
    <span class="input-group-btn"> 
     <%= f.submit "Follow Project", class: "btn btn-large btn-primary" %></span> 
    <% end %> 

         </div><!-- /input-group --> 
       </div><!-- /.col-lg-6 --> 
     </div><!-- /.row --> 
    </div><!--/container --> 
</div><!-- /jubotron --> 





    <!-- Bootstrap core JavaScript 
    ================================================== --> 
    <!-- Placed at the end of the document so the pages load faster --> 


    <script src="../../assets/js/jquery.js"></script> 
    <script src="../../dist/js/bootstrap.min.js"></script> 
    </body> 
</html> 

我相信它有一切与我的路线和他们设置的方式有关。我一直在寻找一个解决方案。我觉得它很容易。正如你所看到的,我对轨道上的红宝石很新颖。

谢谢!

模型用户

这里是我的用户

# == Schema Information 
# 
# Table name: users 
# 
# id   :integer   not null, primary key 
# email  :string(255) 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 

class User < ActiveRecord::Base 
    attr_accessible :email 

    before_save { |user| user.email = email.downcase } 

    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum:80 }, 
      format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 

end 
+0

我想这是一个拼写错误,但你的部分应该在'用户'而不是'用户',也尝试改变它的名字为'_new.html.erb' - 用下划线。 – zrl3dx

回答

0

局部模板必须以下划线为前缀的模式。这是一个惯例。所以你的app/views/users/文件夹中应该有一个名为_new.html.erb的文件。

+0

这不是一个约定;你必须这样做。 –

+0

这实际上并不是真的,你可以编写你自己的解析器并告诉导轨。 jose valim在制作rails应用程序时有一些很好的例子:http://blog.plataformatec.com.br/2011/04/default-views-in-rails-3-0-with-custom-resolvers/ – phoet

+0

so当我将new.html.erb更改为_new.html.erb时,我得到一个新错误,说明了NilClass:Class的未定义方法'model_name',现在即使当我访问http://0.0.0.0:3000/users /新它说模板丢失。那么,如何定义一个模型,以便我的index.html.erb视图能够提取它呢? –

0

在错误消息方面,rails并不是很好。像@Agis已经回答,这里真正的问题是,它正在寻找一个以下划线开头的文件。

如果您在视图中使用render方法,则默认情况下它正在查找偏分数。看看这里的文档:http://apidock.com/rails/ActionView/Helpers/RenderingHelper/render

这不同于调用render在一个动作,其中一个视图模板将得到与布局呈现。

无论如何,您通常不会仅仅将视图重用为部分视图。这样做很不常见,所以你可以将视图的一部分提取到局部并重新使用它,即登录表单或类似的东西。

我希望能帮助你对轨道有一个基本的了解。

+0

所以当我将new.html.erb更改为_new.html时。erb我得到一个新的错误,说明未定义的方法'model_name'为NilClass:类,它现在甚至说,即使当我得到0.0.0.0:3000/users/new它说模板丢失。那么,如何定义一个模型,以便我的index.html.erb视图能够提取它呢? –

+0

我把我的模型放在 –

+0

以上,你的'@ user'就是因为它是在'SessionController'中设置的,我猜。你将不得不在你渲染该部分的每个控制器中设置它。简单的方法是通过编写'User.new'而不是'@ user'来设置它的形式 – phoet