Ruby on Rails Generating Views

前端 未结 4 987
名媛妹妹
名媛妹妹 2021-01-31 13:52

Is there a way to generate the views separately using the rails generate command? I would also be willing to install a gem to accomplish that task f one exists. Basically the sc

相关标签:
4条回答
  • 2021-01-31 14:16

    One particular situation is when you want to add a new view to an existing controller.

    In that case, just use the regular command, but be careful to say 'n' every time prompted in order to not overwrite existing files.

    For example, adding a view called 'invite' to an existing controller named 'projects':

    smith@ubuntuSrv16DEV4:~/railsapps/project_manager$ rails -v
    Rails 5.1.4
    smith@ubuntuSrv16DEV4:~/railsapps/project_manager$ rails generate controller projects invite
    Running via Spring preloader in process 46253
        conflict  app/controllers/projects_controller.rb
    Overwrite /home/smith/railsapps/project_manager/app/controllers/projects_controller.rb? (enter "h" for help) [Ynaqdh] n
            skip  app/controllers/projects_controller.rb
           route  get 'projects/invite'
          invoke  erb
           exist    app/views/projects
          create    app/views/projects/invite.html.erb
          invoke  test_unit
        conflict    test/controllers/projects_controller_test.rb
      Overwrite /home/smith/railsapps/project_manager/test/controllers/projects_controller_test.rb? (enter "h" for help) [Ynaqdh] n
            skip    test/controllers/projects_controller_test.rb
          invoke  helper
       identical    app/helpers/projects_helper.rb
          invoke    test_unit
          invoke  assets
          invoke    coffee
       identical      app/assets/javascripts/projects.coffee
          invoke    scss
        conflict      app/assets/stylesheets/projects.scss
        Overwrite /home/smith/railsapps/project_manager/app/assets/stylesheets/projects.scss? (enter "h" for help) [Ynaqdh] n
            skip      app/assets/stylesheets/projects.scss
    smith@ubuntuSrv16DEV4:~/railsapps/project_manager$ 
    
    0 讨论(0)
  • 2021-01-31 14:19

    You can generate the controller and the view using the controller generator.

    rails g controller controllername new create
    

    This will create actions new and create with their corresponding views.

    You still need to set up your routes manually with this.

    0 讨论(0)
  • 2021-01-31 14:24

    the first part is the name of the model/controller, the second part are the actions.

    0 讨论(0)
  • 2021-01-31 14:29

    As previously mentioned by sameers there was post that showed how to just generate a the views. It will create all the views for your model using the rails default templates which is very handy.

    If like me you want something a little more customizable you can achieve the following.

    You can create your own generator so you have something like this.

    rails generate view NAME VIEW [options]

    To achieve this you need to do the following.

    rails generate generator view

    This will generate a few files for you in lib/generators/view/ folder.

    Open the view_generator.rb file and add the following code.

    class ViewGenerator < Rails::Generators::Base
      source_root File.expand_path('templates', __dir__)
      argument :name, type: :string
      argument :action, type: :string
    
      def generate_view
        template "#{file_name}.html.erb", "app/views/#{folder_name}/#{file_name}.html.erb"
      end
    
      private
    
      def folder_name
        name.underscore
      end
    
      def file_name
        action.underscore
      end
    
      def type
        name.titleize.singularize
      end
    
      def down_type
        name.downcase.singularize
      end
    
      def render_form
        "<%= render 'form', #{down_type}: @#{down_type} %>"
      end
    
      def render_link_back
        "<%= link_to 'Back', #{folder_name}_path %>"
      end
    end</pre>
    

    Next you need to create the file that we are using actual template used in generate_view method.

    Using the action new as example, create a filelib/generators/view/new.html.erb and add the following.

    <h1>New <%= type %></h1>
    
    <%= render_form %>
    
    <%= render_link_back %>
    

    Customize the template view as much as you want. You will need to add the _form.html.erb as well. Add any additional variables and logic in your view_generator.rb file and you are done.

    It's more work but can be worth it if you find yourself generating similar views all the time.

    Best use case I can think of for this approach is if you white label your platform and need to generate multiple files for a clients profile.

    0 讨论(0)
提交回复
热议问题