質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3808閲覧

Ruby on Railsの rake taskの挙動について

tomuziso

総合スコア40

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/11/21 03:16

Ruby on Railsで簡単なRake taskを作っています。

namespace :create_account do desc 'ユーザーを作る' task :user, [ 'login','password' ] => :environment do |task, args| User.create! ( login: args.login, password: args.password, password_confirmation: args.password ) end end

このようなrake taskがある場合、
bin/rake create_account:user[123, 123123]
だと

rake aborted! Don't know how to build task 'create_user:company[123,' (see --tasks)

一方

bin/rake "create_account:user[123, 123@123.jp, 123123]" bin/rake create_account:user[123,123123]

だと正常に終了します。
この3つの違いは何なのでしょうか?
ダブルクオーテーションを付けた時と付けなかった時でどう変わるのかが分かっていません。
引数の配列?の半角スペースを削った時に動くので半角スペースが原因であるというのは分かりましたが、""のありなしでどう変わるのか教えていただきたいです。

もう一つ
task :user, [ 'login','password' ] => :environment do |task, args|
|task, args|という箇所でargsという引数だけ使うので
|args|だけに変更した所、NoMethodErrorでエラーが出ました。
ここの|task, args|はセットみたいなものと考えていいのでしょうか?

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これはRakeの問題というよりは、シェルでの引数処理の問題です。

bash

1bin/rake create_account:user[123, 123123] 2# bin/rakeに「create_account:user[123,」と「123123]」という2つの引数が渡される 3 4bin/rake "create_account:user[123, 123@123.jp, 123123]" 5# 引用符でくくった場合は、1つの引数として解釈される 6 7bin/rake create_account:user[123,123123] 8# スペースがないので1つの引数の扱い

|task, args|という箇所でargsという引数だけ使うので

使わない引数がある場合は、|_, args|のようにするのが慣習です。|args|だけにしてしまうと、渡されるものが[task, args]という配列となるので、正常に動きません。

投稿2017/11/21 03:20

編集2017/11/21 03:23
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomuziso

2017/11/21 03:50

ありがとうございます。 とても分かりやすいです。 てっきり、create_account:userに引数として[123, 123123]という形で渡しているのかと思ったらそうではなく、内部的にはbin/rakeに引数を渡している形になるのですね。初めて知りました。 スペースがある場合は[123,][123123]と分解されるのも想像がつかなかったです。 後者の質問は |task, args|だと taskに:companyが argsに[ 'login','password' ]が入るはず。 しかし、|args|だけにすると [:company, [ 'login','password' ]]が配列としてargsに渡されるという認識でいいでしょうか?
maisumakun

2017/11/21 03:59

ブロックに渡す引数と受け取る引数の数が違うと、配列に詰めたりバラしたりと、自動的に変形していきます。
tomuziso

2017/11/21 04:12

なるほど、勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問