首页 > 解决方案 > 里亚尔路由错误:因为控制器名称与型号名称不同?

问题描述

每个人!我是 Rails 新手,正在编写 Codecademy 教程。但我想看看我是否可以使用 VS Code 在我的 Mac 上运行相同的应用程序并遇到一些障碍。该应用程序基本上是创建一个接收消息并显示它的表单(在索引视图中)。我想探索将控制器和模型的名称更改为我想要的名称,并猜测我搞砸了内部路由。以下是控制器(messagec)

class MessagecController < ApplicationController

    def index
        @messages1 = MessagesMo1.all
    end

    def new
        @messages2 = MessagesMo1.new
    end

    def create
        @messages2 = MessagesMo1.new(message_params)
        if @messages2.save #tells if the object is saved successfully in db or not
           flash[:success] = "Great! Your post has been created!"
           redirect_to '/messages'
        else
          flash.now[:error] = "Fix your mistakes, please."
          render 'new'
        end
    end

    private
    def message_params
      params.require(:message).permit(:content)
    end
end

以下是模型(messagesmo1)

class CreateMessagesMo1s < ActiveRecord::Migration[6.0]
  def change
    create_table :messages_mo1s do |t|
      t.text :content
      t.timestamps
    end
  end
end

以下是routes.rb文件

get '/messages' => 'messagec#index'
get '/messages/new' => 'messagec#new'
post 'messages' => 'messagec#create'
post 'messages_mo1s' => 'message_mo1s#create'

以下是 create.html.erb 文件中的代码

    <%= form_for(@messages2) do |f| %>
    <div class = "field">
        <%= f.label :message %><br>
        <%= f.text_area :content %>
    </div>
    <div class = "actions">
    <%= f.submit "Create" %>
    </div>
    <% end %>

我能够看到消息列表并能够去创建新的消息页面。但是当我提交表单时,我收到以下路由错误:

未初始化的常量 MessageMo1sController 您的意思是?MessagecController MessagesMController

我的第一个问题是:1)我在 routes.rb 文件中缺少什么?2) 命名模型与控制器命名有什么规则吗?

标签: ruby-on-railsmodel-view-controllervisual-studio-coderuby-on-rails-6

解决方案


我只是复制了以上所有内容,我认为有很多事情要记住。

  1. 您的模型文件必须具有名称messagesmo1.rb并且在此模型中:

    class MessagesMo1 < ApplicationRecord
    end
    
  2. 您的控制器文件应该是名称messagec_controller.rb并在其中:

    def index
      @messages1 = MessagesMo1.all
    end
    
    def new
      @messages2 = MessagesMo1.new
    end
    
    def create
      @messages2 = MessagesMo1.new(message_params)
      if @messages2.save #tells if the object is saved successfully in db or not
        flash[:success] = "Great! Your post has been created!"
        redirect_to '/messages'
      else
    
        flash.now[:error] = "Fix your mistakes, please."
        redirect_to '/messages/new'
      end
    end
    
    private
    def message_params
      params.require(:messages_mo1).permit(:content)
    end
    
  3. 上面这点,看message_params部分,一定是:messages_mo1而不是:message

  4. _form.html.erb文件无需更改

  5. 您的迁移文件必须具有名称timestamp__create_messages_mo1s.rb,并且必须具有:

    class CreateMessagesMo1s < ActiveRecord::Migration[6.0]
      def change
        create_table :messages_mo1s do |t|
          t.text :content
    
          t.timestamps
        end
      end
    end
    
  6. 在您的routes.rb文件中,更改最后一条路线:

    get '/messages' => 'messagec#index'
    get '/messages/new' => 'messagec#new'
    post 'messages' => 'messagec#create'
    post 'messages_mo1s' => 'messagec#create'
    
  7. 确保您的所有链接都在index.html.erb、 inshow.html.erb和 in中更新new.html.erb-> Like 链接以显示、删除、编辑等。或者如果您只是测试删除这些链接。

  8. 进行上述更改后,运行rails db:drop db:create db:migrate它会清除旧迁移的数据库。

  9. 就是这样,现在一切都应该工作了。主要问题是命名约定应该是所有文件的标准。所以最好使用标准约定。


推荐阅读