SWIFT 関数 外部引数名と内部引数名について
Swiftの外部引数と内部引数についてまとめる。 関数を呼び出すときには、外部引数名を利用します。 まず関数定義から
func party(user: String, to group:String){ print("\(user)さんは、\(group)のパーティに招待されています") }
ここでまず引数が2つありますね。 " , "で分けてあります。
引数の1つ目は user 、型はString型
引数の2つ目は " , "よりあとですがここでは、外部引数名、内部引数名、型 で表現されています。
外部引数名が to
内部引数名が group
型がString型
この関数の内部で利用するときは、内部引数名を利用します。
group ですね。
関数内では,"\(group)"のように利用されています。
これは変数展開で " ~ " の中はすべて文字列として表示されますが、swiftの場合 \( 変数 ) と書くと文字列の中でも、変数を変換してくれて出力してくれるものです。
話がそれましたが、party関数の第二引数には、外部引数名 toが明記されています。
よって関数を呼び出すときには、この外部引数名を利用します。引数ラベルとも言います。
関数を呼び出す時
party(user: "Fujiwara", to: "サンフレッチ")
そう少し違和感があるかもですが、関数を呼び出すときは、
外部引数名 to を利用します。
これを実行すると
Fujiwaraさんは、サンフレッチのパーティに招待されています。
と表示されます。 以上関数呼び出し時の引数についてまとめました。 他にもイニシャライザの呼び出し時には、外部引数をすべて表示しないといけなかったり いろいろとあります。 一番使用頻度の高いと思われるものをまとめてみました。 以上
なぜbundle exec rails db:migrateなのか
どうしてbundleが必要なのか調べたのでメモ bundle execは、現在のバンドル(ディレクトリのGemfileからのもの)のコンテキストでスクリプトを実行するためのBundlerコマンド。
実は、bundlerもgemの一つ rails db:migrateはスクリプトで、dbは名前空間で、migrateは定義されたタスク名。 したがって、exec rake db:migrateをバンドルすると、現在のバンドルのコンテキストでdb:migrateコマンドを使ってrailsスクリプトが実行されます。
場合によっては、実行可能ファイルがすでにシステムにインストールされ、競合しないなら問題なく利用できます。 将来、または別のマシンで動作しない可能性があります。 これはデプロイ時に動かくなくなる可能性もあるということ。 これはあまりにリスクが高すぎる。 よってめんどくさくても, bundle execは必ず書きましょう! 以上
xcodeでGithubからpullする方法
xcodeでGithubからpullする方法がなかなか書いていなかったので、自分でまとめてみました。 条件 1) すでにGitHubにリポジトリがあり、そこからpullするときの話
2) Xcode9.4.1
3) まだマイクロソフトに買収されたばかりで、操作性の良いものがGitHubで提供されている状態。->これからスカイプのように、操作性は、どんどん悪くなると思われる。他のサービスの利用も準備しておかないといけない。
プロジェクトナビゲーターの上のアイコンの左から2つ目 これがgit関係を管理するところ
右クリックにてadd exsiting Remote
それぞれの値を入力します。
最後にGitHubのユーザー名とパスワードを求められるので入力。
最初からリポジトリ作成してpushする場合はこちらの記事
がいいと思いました。 以上。
RailsでGoogleMapを表示させる
gem 'gmaps4rails'の使い方 の手順をまとめてみた。
やりたいことはこれ
エラー cannot load such file -- coffee_script
公式サイト
いきなりエラー cannot load such file -- coffee_script
idがかぶるとありえない。だめ JavaScriptが意図しない動きになる。 原因 あちこちsubmitがある。 理由 画面が別れていてもどこの画面であっても問題ない。パーシャルになっていても同じ画面ならファイル違っていてもJavaScriptなので、submit取得できる。
住所表示ボタン
<%input id="submit"class="btn btn-primary" type="button" value="住所をを表示">
formのsubmitは
<%= form.submit %>
これらは別物である。
気を取り直し、コントローラのソースを見る.
def index @datperson2s = Datperson2.all @hash = Gmaps4rails.build_markers(@datperson2s) do |user, marker| marker.lat user.latitude marker.lng user.longitude end end
はじめ理解できなかった。これRubyは引数の()を省略できる。
marker.lat(user.latitude)
これと同じである。
marker.latは 関数のようである。 リファレンスのここでチェック。
Google-Maps-for-Rails/markers_builder.rb at master · apneadiving/Google-Maps-for-Rails · GitHub
51行目付近にある。
def lat(float) @hash[:lat] = float end
セッタのようになっている git で公開しているものはソースで確認すること!
HTMLに組み込む時、ERBではコピペで組み込める。slimを使う意味がわからない。HTMLからすべて作る場合はいいかもしれない。
リファレンス確認しながら進める。
1)gemはok
2)HTMLも書いた
見つからなければエラーになるので大丈夫
3)JavaScriptはapplication.html.rbに記載した
もともとあったのがおかしかった 文字がエスケープされていた
4) Javascript source code
アセットパイプラインに入れないといけないので sprocketというjemに書き出される
アセットパイプラインとは
JavaScriptやCSSを最小化して連結するフレームワーク gem 'sass-rails' gem 'uglifier' gem 'coffee-rails'
これらのgemを利用する よってコーヒー使わなくてもコヒーを削除してはいけない ただコーヒーファイルをjsに変更するだけでよい。
ウエブページをレンダリングする際に、リクエストをへらすことができる
If you don't have asset pipeline, you'll need to import the js OR coffee files: rails g gmaps4rails:copy_js
rails g gmaps4rails:copy_coffee アセットが無いならこれを使いなさい あるからいらない
5) Javascript code:
スクリプトタグの中に書いた グーグルはコメントした
handler = Gmaps.build('Google'); handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){ markers = handler.addMarkers([ { "lat": 0, "lng": 0, "picture": { "url": "http://people.mozilla.com/~faaborg/files/shiretoko/firefoxIcon/firefox-32.png", "width": 32, "height": 32 }, "infowindow": "hello!" } ]); handler.bounds.extendWith(markers); handler.fitMapToBounds(); });
6) Add options: グーグルのオプションを利用したいときはこのようにする
Generating JSON これはコントローラに書いている
@users = User.all @hash = Gmaps4rails.build_markers(@users) do |user, marker| marker.lat user.latitude marker.lng user.longitude end
ここでビューに渡している In your view:
これを利用して、上記を書き換えた。 これがコントローラーからviewへ値を出力しているところ。
このアプリでは、MAPをいろんなところから読み込むので ハッシュに入っていないと表示できない indexはいい。もう詰め込んであるのを表示するだけなので。 editでは,addmarkerを呼んであげないといけない。グーグルの関数で動的にやっていかないといけない。
エラーfirstchildがnill 一度railsのサーバーを再起動してみる。これは イニシャライズで読み込まれたり、アセットパイプラインを変更した場合エラーが治る可能性があるためである。 ここを見ると、DOM構築後に読み出さないといけない。読み込みのタイミングだけの話 https://github.com/apneadiving/Google-Maps-for-Rails/issues/534
onloadの書き方。ここをみて修正 https://developer.mozilla.org/ja/docs/Web/API/GlobalEventHandlers/onload
普通はクリックするとページが切り替わる。 ターボリンク使うと中身をAjaxが全部書き換えている 実際にはページ遷移していないのでページ書き換わらない。 そのタイミングでJavaScriptを走らせる
document.addEventListener('turbolinks:load', function() { });
このgemは一体なんなのか?railsのコントローラとviewを簡単につなげてくれるgemである。 editではjavascriptで動的に追加しないといけない
フロントでJavaScriptで詰め込まないといけない。取得したものをinnerHTMLで入力か? 位置情報の修正はjavascriptで行うしか無い。 以上!
Swift オプショナルバインディングとは
オプショナルバインディングについてまとめます。
まず、なぜ存在するのか?
条件分岐や繰り返し処理のときにオプショナル型にnilが入っていたら処理を分けたいときがあります。そのときに値の有無に応じて処理を分けます。
if ~ let文を利用します。
if let 定数名 = オプショナル型の値 {
値がある場合の処理
}else {
値がない場合の処理
}
これが基本の書き方
例文
if let _ = str {
print(str)
}
なにこれ?
と思うかもです。まとめます。
var str:String?
if let a = str {
print(str)
}
オプショナル型のstrが宣言されています。
a には strを代入してね。その値があるときにはstrを出力しましょう。
という意味です。
しかし、毎回aなどの利用しない変数を宣言するのは、良くないので
引数名を省略したいときには Swiftでは _ が利用できます。
それを利用しています。
だから
if let _ = str {
print(str)
}
こうなります。_ はただ、引数名を省略しているだけですね。
Rails GoogleのAPIで表示したデータを保存する
APIのデータは取得した型でそのままコントローラに送るとエラーになります。
nilが渡ってしまう。
リンクしたときに、DBに保存したい。
createを呼ぶべき。createはpostなので、formを利用しないといけない。
<div class="w3-row-padding w3-padding-16 w3-center">
<%= @books.each do |book| %> <//ここでもらった仮引数を詰め込みます。
<%= form_for(book) do |f| %>
<div class="w3-quarter">
<%= book.title %>
<%= book.author %>
<%= book.publish %>
<%= book.published %>
<%= link_to image_tag("#{book.image_link}"),
new_book_path(book) %>
<%= f.hidden_field :title %>
<%= f.hidden_field :author %>
<%= f.hidden_field :publish %>
<%= f.hidden_field :published %>
<%= f.hidden_field :image_link %>
<i class="fas fa-pencil-alt"><%= f.submit value="シェアする"%></i>
</div>
<% end %>
<% end %>
</div>
formタグは、hiddenにできます。とりあえずformタグを利用することが大切。
DBに保存する必要はないです。indexは取得するだけなので、
eachともちろん併用できます。each文の中で回さないと意味がないです。仮引数でループ回していくので。
標準のscafforldingを見て参照すると良い。//=>大切です。
_from.html.erbを参照する。
そこには、このように記載してあります。
<%= form_with(model: book, local: true) do |f| %>
formを回しなさいということですね。
form_forを確認すると、
form_for(モデルオブジェクト [, オプション]) do |f|
end
第1引数はオブジェクト名、第2引数は?
モデルにオブジェクトが入っていれば、それを保存するというのがfromの仕様になっているよう。なので、値を入れておかないといけない。
@booksに入っているのがGoogleAPIの型になっている。
これが1番の問題。
これを解決するために、取得したあと、DBに書き込まずにモデルだけ作るのはどうか?。行けそうである。
mapを利用する。一度に変換してしまう。
なんて素晴らしいmap!
すべてがオブジェクトのRubyも素晴らしい!
def index
@books = GoogleBooks.search(params[:search],{:count => 20}).map{|googlebook| book = Book.new
book.title = googlebook.title
book.author = googlebook.authors
book.publish = googlebook.publisher
book.published = googlebook.published_date
book.image_link = googlebook.image_link
book
}
end
一度mapの中で変数に入れないといけない。仮引数をgoogleBookにします。
Book.newはスタティックな値なので大文字。
あとは値を詰め込むだけ。
mapの中で返却しないといけない。
なのでbookは必要です。
ストロングパラメータでないと、ハッシュは詰め込めないので、別途ストロングパラメータを設定しておく。
ポイントは
1-GoogleBookのモデルを、ActiveRecordの型でオブジェクト作り直しました。
もうオブジェクト作ったので、formも簡単に作れます!
2-createはpost。そのためには、formが必要なのでformを作成しました。
Ruby (Rails) ハッシュのキー書き方まとめ 忘備録
ハッシュの書き方をまとめておきますね。
railsでよくある
params[:id]
これはなんなのか?
Railsで使われるparamsとう変数のidというkeyにアクセスしているのです。
そして、これは多くは、Railsでは、Viewからコントローラへ値を渡すときに用いられます。
まず基本のハッシュの書き方から説明しますね。
配列は
str = [1,3,5,6]
というふうに値が一つづつ入っていますね。
これをキーと値というもので2つ一組でセットで入っているものがハッシュといいます。
便利ですね。配列は[ ] で要素を囲みますが、ハッシュは{ } で要素を囲みます。
str = {"name" => "Ichiro", "age" => 28}
nameにはIchiro ageには28があります。
これが全体として、一つの値なので一つの変数 strに詰め込むことができます。
アクセスするときにはキーを指定します。
str["name"] // => Ichiro が取得できます
ハッシュはすべて文字列になるのでそこだけ注意!
でもって
ハッシュの書き方の続きです。
{"name" => "Ichiro", "age" => 28}
このハッシュは
シンボルというものを利用してこのようにも欠けます。
シンボルは :コロンを利用した書き方の事です。
{:name => "Ichiro", :age => 28}
ただ""を:に置き換えただけですね。
でも""で囲まななくていいので、書くのは楽です。
さらに
{name: "Ichiro", age: 28}
コロンをキーの後ろに持ってくると =>も省略できます。
これは楽!!
だからこのように書くことが多いのです。
では、また