web-dev-qa-db-ja.com

Ruby on Railsビューの生成

Rails generateコマンドを使用してビューを個別に生成する方法はありますか?存在するタスクを実行するためにgemをインストールすることもできます。基本的にscaffoldingコマンドは私に多くを与え、コントローラーを手動でコーディングしたいのですが、レコードのテーブルを使用してインデックスビューを作成するのはあまり効率的ではありません。

54
Jason Yost

コントローラージェネレーターを使用して、コントローラーとビューを生成できます。

Rails g controller controllername new create

これにより、対応するビューを持つアクションnewおよびcreateが作成されます。

これを使用して手動でルートを設定する必要があります。

86
Gazler

特定の状況の1つは、既存のコントローラーにnewビューを追加する場合です。

その場合は、通常のコマンドを使用しますが、既存のファイルを上書きしないようにプロンプ​​トが表示されるたびに'n'と言うように注意してください。

たとえば、'invite'というビューを'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$ 
2
Varus Septimus

最初の部分はモデル/コントローラーの名前、2番目の部分はアクションです。

2
Martin Lang

同じ人が以前に述べたように、ビューを生成する方法を示す投稿がありました。非常に便利なRailsデフォルトテンプレートを使用して、モデルのすべてのビューを作成します。

私のように、もう少しカスタマイズ可能なものが必要な場合は、以下を達成できます。

独自のジェネレータを作成して、このようなものを作成できます。

RailsはビューNAME VIEW [オプション]を生成します

これを実現するには、次のことを行う必要があります。

Rails generate generator view

これにより、lib/generators/view /フォルダーにいくつかのファイルが生成されます。

View_generator.rbファイルを開き、次のコードを追加します。

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>

次に、generate_viewメソッドで使用される実際のテンプレートを使用しているファイルを作成する必要があります。

例としてnewアクションを使用して、filelib/generators/view/new.html.erbを作成し、次を追加します。

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

<%= render_form %>

<%= render_link_back %>

テンプレートビューを必要なだけカスタマイズします。 _form.html.erbも追加する必要があります。 view_generator.rbファイルに追加の変数とロジックを追加すれば完了です。

それはより多くの作業ですが、常に同じようなビューを生成していることに気付いた場合は価値があります。

このアプローチの最良の使用例は、プラットフォームにホワイトラベルを付け、クライアントプロファイル用に複数のファイルを生成する必要がある場合です。

0
spqr-praetoria