2016年12月30日 星期五

Ruby Koans - String

  def test_the_shovel_operator_modifies_the_original_string
    original_string = "Hello, "
    hi = original_string
    there = "World"
    hi << there
    assert_equal "Hello, World", original_string

    # THINK ABOUT IT:
    #
    # Ruby programmers tend to favor the shovel operator (<<) over the
    # plus equals operator (+=) when building up strings.  Why?
  end
主要是在講用了hi = original_string 之後改變hi裡面的值會連original_string的值也一起改了
Ruby裡面這些都是reference,hi = original_string 之後他們兩個就會參照到同一個物件
2.3.1 :121 > original_string.object_id
 => 70169322460680
2.3.1 :122 > hi.object_id
 => 70169322460680
如果今天是用+=的話,因為這是一個assignment,他們的object_id就會不一樣了
2.3.1 :112 >     original_string = "Hello, "
 => "Hello, "
2.3.1 :113 >     hi = original_string
 => "Hello, "
2.3.1 :114 >     there = "World"
 => "World"
2.3.1 :115 > hi += there
 => "Hello, World"
2.3.1 :116 > hi
 => "Hello, World"
2.3.1 :117 > original_string
 => "Hello, "
Written with StackEdit.

Ruby Koans - Hashes

  def test_default_value_is_the_same_object
    hash = Hash.new([])

    hash[:one] << "uno"
    hash[:two] << "dos"

    assert_equal ["uno","dos"], hash[:one]
    assert_equal ["uno","dos"], hash[:two]
    assert_equal ["uno","dos"], hash[:three]

    assert_equal true, hash[:one].object_id == hash[:two].object_id
  end
這次是做這題的時候卡住了,我本來以為<<是會把值加到hash裡面去,但是其實
hash根本沒有<<,array才有
因為第一行預設了hash的值是空陣列,所以這邊才不會跳error
兩行<<其實都是把值丟到一開始預設的空陣列裡面
所以不管是hash[:one]還是hash[:two]都會得到一樣的東西
反過來說,如果一開始只是下面這樣,就會error
NoMethodError: undefined method `<<’ for nil:NilClass
hash = {}
hash[:one] << "uno"
Written with StackEdit.

CodingGame - Horse-racing Duals(easy)

就是給你一串數字,然後找出相差最小的差是多少
如果知道each_cons就很快可以解決
pi_array = []
min = 99999999999999999
@n = gets.to_i
@n.times do
    pi = gets.to_i
    pi_array << pi
end
new_pi = pi_array.sort

new_pi.each_cons(2) do |a,b|
    if min > (b-a)
        min = (b-a)
    end

end
puts min
Written with StackEdit.

2016年12月29日 星期四

Ruby Koans - Array

  def test_slicing_arrays
    array = [:peanut, :butter, :and, :jelly]

    assert_equal [:peanut], array[0,1]
    assert_equal [:peanut, :butter], array[0,2]
    assert_equal [:and, :jelly], array[2,2]
    assert_equal [:and, :jelly], array[2,20]
    assert_equal [], array[4,0]
    assert_equal [], array[4,100]
    assert_equal nil, array[5,0]
做這題的時候碰到了一些問題,我本來以為後面三個都會是nil,因為沒有array[4]可以抓,但是結果卻是要到[5]才會變成nil
http://stackoverflow.com/questions/3568222/array-slicing-in-ruby-looking-for-explanation-for-illogical-behaviour-taken-fr
依照上面解釋的,slicing和indexing本身就是不一樣的
slice第一個變數定義的是元素之間的space,像下面這樣,4還是有在裡面的
  :peanut   :butter   :and   :jelly
0         1         2      3        4
Written with StackEdit.

2016年12月28日 星期三

CodingGame - Mime Type(easy)

https://www.codingame.com/ide/puzzle/mime-type
最大的卡住是在有一題他會給你”“.mp3.”
我本來以為用split(‘.’)他會拆成
["", "mp3", ""]
結果是這樣
["", "mp3"]
要在後面加-1才會變成我心目中以為的樣子
http://ruby-doc.org/core-2.3.1/String.html#method-i-split
fname.split('.', -1)

@n = gets.to_i # Number of elements which make up the association table.
@q = gets.to_i # Number Q of file names to be analyzed.
list = {}
@n.times do
    # ext: file extension
    # mt: MIME type.
    ext, mt = gets.split(" ")
    list[ext.downcase] = mt
end
# STDERR.puts ext2, mt2
STDERR.puts list

@q.times do |i|
    fname = gets.chomp # One file name per line.
    fname_ext = fname.split('.', -1)[-1].downcase
    STDERR.puts "fname " + fname
    if fname.split('.').size != 1

        if list.has_key?(fname_ext)
            puts list[fname_ext]
        else

            puts "UNKNOWN"
        end
    else
        puts "UNKNOWN"
    end
end
上面是我的解答,就很普通的那種XD
後來看別人寫的
@q.times do
    puts @map[File.extname("x#{gets.chomp}").gsub('.', '').downcase]
end
原來有extname可以直接抓副檔名阿…………
https://ruby-doc.org/core-2.2.0/File.html
Written with StackEdit.

kindle

http://booklog.jp/users/telsaiori

kindle買來一年多了,當初很擔心會不會用了1,2個月就被我丟到一邊了,畢竟沒有繁體中文的書可以買,還好用了一年多到現在還是很愛


出來工作以後我看的書比學生的時候少了很多很多,但本質上我算是喜歡閱讀的人
一開始也是想說英文書很多,可以方便買來練一下英文,但結果英文書還是看得不多XD
畢竟很快我就累了冏(如果看言情小說的話是很輕鬆,但是每一本故事都差不多,很快就膩了)
最後實質上還是日文看最多,簡中的也從中國amazon買過幾本,他們電子書賣超便宜的
電腦相關的工具書也買過一些,結論上來說這類型的還是實體書才棒棒

英文的買過一些Cambridge English Readers系列的來看,有分級所以很容易找到適合自己英文程度的書來看,但是故事本身就普普,沒有很吸引我的

日文書的話買過不少
這本書蠻有趣的,雖然有些人聽到女裝可能臉就先歪一半(畢竟很多人心中還是很堅持男生要有男生的樣子,女生要有女生的樣子)
首先這個作者,不管生理還是心理都是男的,並且已婚,就算女裝一年他也沒有愛上男人,他只是單純好奇男女之間到底真正的差別是甚麼,還有把男女綁住的東西是從哪來的,內容並沒有任何和誰好誰壞有關的內容,這只是他自己的實驗過程記錄,以一個完全異性戀的男人來寫這類型的書應該很少見

另外就是貴志祐介的來自新世界,這本外面也有賣中文翻譯本,超超超超超超超超超超超超超超推薦,當初看下去完全不想停,雖然在第一本的前半部覺得普普,但之後真的不想停

最後我在中國kindle買了一系列斯維拉娜‧亞歷塞維奇的書,
都蠻好看的

不過還是偶爾會碰到有我想要的書,但是英日簡中都買不到電子書,或者是他有英文版,但超出我能理解的英文等級,比方說一些推理小說,因為要注意到的細節很多,以我的英文程度去看可能會東漏西漏的,或者是依些比較篇研究的類型也不太適合我

這本是最近在等電子書,網頁上已經有了,但kindle版還在預購中

2016年12月16日 星期五

Update CSS Variables with JS

Update CSS Variables with JS

demo:
https://telsaiori.github.io/Update-CSS-Variables-with-JS/index.html
javascript30:
https://javascript30.com
先在root裡面命名變數,變數開頭一定要是”–”,且會分辨大小寫為不同變數
:root {
--base: #ffc600;
--spacing: 10px;
--blur: 10px;
}
要使用時像下面這樣,就會按照變數去設定了
img {
padding: var(--spacing);
background: : var(--base);
filter: var(--blur);
}
http://codepen.io/mukiwu/pen/PNZzbd
也可以在其他selector裡面定義變數,讓不同的地方套用不一樣的顏色
接下來需要抓三個input的value
function handleUpdate(){
console.log(this.value);
}

inputs.forEach(input => input.addEventListener('change', handleUpdate));
像上面那樣雖然可以順利抓到值,但要在滑鼠放開的時候才會觸發,滑鼠移動的時候不會有功用,所以要再加入偵測滑鼠移動event
inputs.forEach(input => input.addEventListener('mousemove', handleUpdate));
但因為spacing和blur的設定是數字+px,照上面的寫法只抓得到數字,沒辦法直接拿來用,所以這個案例在input後面加了data來定義他們的單位
<input type="range" name="spacing" min="10" max="200" value="10" data-sizing="px">

<label for="blur">Blur:</label>
<input type="range" name="blur" min="0" max="25" value="10" data-sizing="px">
我們可以使用dataset來抓取所有的data內容
const suffix = this.dataset;
最後完成的function如下
function handleUpdate(){
// console.log(this.value);
const suffix = this.dataset.sizing || '';
document.documentElement.style.setProperty(`--${this.name}`, this.value + suffix);
}
suffix是用來抓data的值,因為base沒有設定data,所以多了or去判斷
Written with StackEdit.

2016年12月15日 星期四

hanaso心得

之前第一次上課覺得還不錯的老師上第二次之後覺得還是換一個
環境噪音真的有點大,這樣子聽三十分鐘有點痛苦

這禮拜有一次有選到一個native的老師,腔調當然不用說,但我覺得除非你已經是真的很會講,只是想要讓自己更靠近native的人才比較有需要特別選native
不然挑個腔調自己可以接受的菲師也很ok,hanaso裡面還蠻多可以找的我覺得


這禮拜也第一次選了topic talk,之前都是上英文會話,就是照著它們的教材上,壓力比較小,比較沒有硬要擠出字的必要,畢竟就是念教材上的字,但覺得對於訓練會話的幫助就還好而已
但也沒有好到可以選free talk(正確地說就算是中文我也不是那種可以隨便和人聊天聊三十分鐘的人),所以選了topic talk

有幾個主題可以讓你自由選擇,也是有一點點教材會教你一些單字和句子,但老師問你的問題都是沒有正確解答必須要自己想,對於硬逼自己訓練比較有用
當然也有一些主題看起來就很難聊的,記得有看到一個主題是"君主制"

2016年12月12日 星期一

CSS + JS Clock(javascript30)

#
CSS + JS Clock
demo:
https://telsaiori.github.io/javascript_css_clock/index.html
javascript30:
https://javascript30.com
在最一開的時候如果直接用
transform: rotate(260deg)

transform-origin

來旋轉時針的話,會得不到我們想要的效果,因為我們需要的是他以時鐘的正中心為中心點為準來旋轉,所以必須使用transform-origin設定中心軸
.hand {
width:50%;
height:6px;
background:black;
position: absolute;
top:50%;
transform-origin: 100%;
transform: rotate(90deg);
}
然後為了讓指針能夠很滑順的轉動,也需要設定轉場的時間
transition: all 0.5s;

transition-timing-function

因會想要營造出指針再走的時候的抖動(?)感加入了
transition-timing-function: cubic-bezier(0.1, 2.7, 0.58, 1);

setInterval

為了要讓時鐘會自動跑,我們先用console.log來看看她會不會自動顯出訊息
function setDate(){
console.log('hi');

}

setInterval(setDate, 1000)
這時候重新整理網頁會看到console裡面的hi一直在增加
setInterval和setTimeout
差別在前者會依指定的秒數重複去執行程式,而後者只會跑一次

取得秒數 &轉換成指針該轉的角度

使用getseconds來取得現在的秒數
const secondHand = document.querySelector('.second-hand');
const hourHand = document.querySelector('.hour-hand');
const minHand = document.querySelector('.min-hand');
function setDate(){
const now = new Date();
const seconds = now.getSeconds();
const secondsDegrees = ((seconds / 60) * 360 + 90);
secondHand.style.transform = `rotate(${secondsDegrees}deg)`;
const hours = now.getHours();
const hoursDegrees = ((hours / 12) * 360 + 90);
hourHand.style.transform = `rotate(${hoursDegrees}deg)`;
const mins = now.getMinutes();
const minsDegrees = ((mins / 60) * 360 + 90);
minHand.style.transform = `rotate(${minsDegrees}deg)`;
}

setInterval(setDate, 1000)
旋轉角度需要+90是因為一開始我們設定預設是停在90度
Written with StackEdit.

2016年12月10日 星期六

javascript drum kit( javascript30)

#
Javascript drum kit
完成品
https://telsaiori.github.io/javascript_drum_kit/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS Drum Kit</title>
<link rel="stylesheet" href="style.css">
</head>
<body>


<div class="keys">
<div data-key="65" class="key">
<kbd>A</kbd>
<span class="sound">clap</span>
</div>
<div data-key="83" class="key">
<kbd>S</kbd>
<span class="sound">hihat</span>
</div>
<div data-key="68" class="key">
<kbd>D</kbd>
<span class="sound">kick</span>
</div>
<div data-key="70" class="key">
<kbd>F</kbd>
<span class="sound">openhat</span>
</div>
<div data-key="71" class="key">
<kbd>G</kbd>
<span class="sound">boom</span>
</div>
<div data-key="72" class="key">
<kbd>H</kbd>
<span class="sound">ride</span>
</div>
<div data-key="74" class="key">
<kbd>J</kbd>
<span class="sound">snare</span>
</div>
<div data-key="75" class="key">
<kbd>K</kbd>
<span class="sound">tom</span>
</div>
<div data-key="76" class="key">
<kbd>L</kbd>
<span class="sound">tink</span>
</div>
</div>

<audio data-key="65" src="sounds/clap.wav"></audio>
<audio data-key="83" src="sounds/hihat.wav"></audio>
<audio data-key="68" src="sounds/kick.wav"></audio>
<audio data-key="70" src="sounds/openhat.wav"></audio>
<audio data-key="71" src="sounds/boom.wav"></audio>
<audio data-key="72" src="sounds/ride.wav"></audio>
<audio data-key="74" src="sounds/snare.wav"></audio>
<audio data-key="75" src="sounds/tom.wav"></audio>
<audio data-key="76" src="sounds/tink.wav"></audio>

<script>


function playSound(e) {
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
if (!audio) return; // stop the fucntion from running all together
audio.currentTime = 0; // rewind to the start
audio.play();
key.classList.add('playing');
}
function removeTransition(e) {
console.log(e);
if (e.propertyName !== 'transform') return; // skip it if it's not a transform
this.classList.remove('playing');
}

const keys = document.querySelectorAll('.key');
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
window.addEventListener('keydown', playSound);

</script>

</body>
</html>
首先要先可以抓到現在使用者按了哪一個key,和相對應的聲音是什麼
所以使用addEventListener來偵測按下key的動作
playSound裡面用了querySelector來抓出相對應的key和聲音
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
這時候如果用console.log(e);的話發現e會代表現在發生的keyboard事件,可以用她抓到keycode得知使用者按了哪個鍵
而上面的html本來各個按鍵和聲音的data就是照著真實的keycode去寫的,因此可以對照在一起
if (!audio) return;
上面這行code是用來判斷如果使用者按了不支援的字母的時候直接中斷function,既然找不到audio也等於不支援
audio.currentTime = 0;
如果不加上面這行的話,如果你想連打某個key讓他連續發出聲音是做不到的,因為他會等現在的聲音播完然後再繼續
currentTime可以指定audio/video播放的當前位置,靠著每次都把它從頭開始播,就不會等到播完了才繼續
然後因為我們會再相對應字母的地方新增playing class,並改變他的樣式,所以必須要寫程式讓他會自動變回來本來的樣子
.key {
...
transition:all .07s;
...
}

.playing {
transform:scale(1.1);
border-color:#ffc600;
box-shadow: 0 0 10px #ffc600;
}
(key有砍掉其他css)
key設定了transition來指定改變外觀需要花多少時間,而playing設定了transform:scale讓元素放大
const keys = document.querySelectorAll('.key');
keys.forEach(key => key.addEventListener('transitionend', removeTransition));
上面keys先抓出所有key class,然後再用forEach一個一個去偵測他有沒有transitionend的event
想當然如果這時候在removeTransition去印出e的話,得到的就是所有正在轉場的event,全部會列出6個
transform:scale(1.1); //一個
border-color:#ffc600; //上下左右各一個
box-shadow: 0 0 10px #ffc600; //一個
最後用this(在這邊會是觸發事件的那個key class)來remove掉playing class
就完成了
Written with StackEdit.

2016年12月8日 星期四

rails tutorials一周目結束

雖然算起來這是第三次了
但前兩次都會卡住看不下去,所以這一次是第一次完整的作完整個sample app(測試以外)
也記了一些memo在gitbook
https://www.gitbook.com/book/telsaiori/rails-tutorial-memo/details

2016年12月5日 星期一

validate / validates

剛在看rails tutorial的時候碰到了一個錯誤訊息
You need to supply at least one validation
錯誤是指向
validates :picture_size
google一下發現因為我不應該用validates,應該要用沒有s的validate
正確完整的code如下
#Listing 13.65: Adding validations to images.
class Micropost < ApplicationRecord
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
  validate  :picture_size

  private

    # Validates the size of an uploaded picture.
    def picture_size
      if picture.size > 5.megabytes
        errors.add(:picture, "should be less than 5MB")
      end
    end
end
validates是用在預設的validation,但是因為picture_size是自定的,所以要用validate
validate會去找有沒有和你給他的parameter一樣的method
validate  :picture_size
他會去找有沒有
def picture_size
end
Written with StackEdit.

增加model error message

增加model error message

一般在model validation沒過的時候,可以從erros去取得錯誤訊息
比方說用full_messages去取得完整錯誤訊息
@user.erros.full_messages
但也可以自行增加錯誤訊息
# from rails tutorial chapter 13
    def picture_size
      if picture.size > 5.megabytes
        errors.add(:picture, "should be less than 5MB")
      end
    end
像上面這樣就可以在圖片大於5MB的時候塞一個錯誤訊息進去
Written with StackEdit.

為什麼選ruby on rails

這應該是這幾天我最常回答的問題
很多人聽到我是又回頭開始重新學程式幾乎都會這樣問我
其實理由很單純,
因為lang8
               因為lang8
                                因為lang8

(但結果這樣問我的人沒有半個聽過這網站冏)
lang8和hi native對要學外語的人來說很好用的,特別是日文(個人覺得改日文的人比改英文的多)

我沒辦法像其他摸程式摸很久的人一樣是喜歡ruby的某些特性才學ruby
因為我沒有比較的語言,所以感覺不出來甚麼優雅不優雅
頂多就是覺得沒有一堆{()};好棒棒啊(但也有人不喜歡靠縮排)
但其實我大學的時候對{{((}}));;; 也沒有障礙啦
(但因為現在學了ruby, 寫javascript的時候反而有障礙= =)
單純只是因為想要學和自己常用的網站一樣的技術
而且因為有follow lang8老闆的twitter,所以常常看到他在貼徵rails工程師的資訊
看久了也自然會覺得"rails?那是甚麼?可以吃嗎?"
對放棄程式很久的我來說,ruby on rails我只知道on是甚麼意思而已(?)
然後就會有一個很標準的菜鳥問題"所以ruby和rails是一樣的嗎?"

但我身邊寫程式的沒有半個寫ruby的
以前大學同學和我說可以去上五倍紅寶石的課
因為我很擔心課不知道是不是初學者也可以上,所以事前先寄了信問了講師(現在看看時間已經快要一年前了)
說初學者ok我就去上課了,最後我上了兩輪
最最最一開始其實我根本不懂params從哪來的(天上掉下來的??)
還有hash的寫法,不是我在說,有點多種
兩次的中間還隔了udacity的ruby nanodegree
外加一次五倍的免費課程-開開心心學ruby
(雖然我個人比較喜歡ex" JAVA,從開始到放棄" 之類的名稱XD)
第二次我才聽懂很多當初第一次我不懂的東西

之後才又去看javascript之類的,只是進步程度和rails比起來很慢,畢竟我還是主要都在練習ruby on rails,要我一次兩種東西有同等程度的進步,有點困難,畢竟我一開始是標準的"痾.........這一段到底是javascript的語法還是其實是jquery都分不清楚的人"
正確地說我一開始連div是幹嘛的都不知道
HTML早就忘了啦啦~~
到現在好不容易覺得自己總算比當初更進入狀況了點
然後就半年多過去了............


http://lang-8.com/telsa/journals/127663289408109021075360132506066210512
日文版XD



2016年12月4日 星期日

2016 Ruby Conf Taiwan

生平第一次參加了ruby conf,基本上也是第一次參加任何的conf
其實不太符合我的個性XD因為我是個會想太多的人,比方說
反正我應該很多聽不懂吧
嗚嗚~一個人參加好孤單
嗚嗚~我來錯地方了
嗚~現在沒錢
之類的..............反正不管甚麼事我都是會很負面想太多的人
但,這次我還是參加了
畢竟既然我認真想走這條路,一個人閉門造車也不好吧



  1. Beware of Alpha Syndrome
  2. The overnight failure
  3. Value And Pain to Keep Rails Applications Alive
  4. Using database to pull your applications weight
  5. It's More Fun to Compute
  6. How I made a pure-Ruby word2vec program more than 3x faster
  7. To Code Is Human
  8. ActionCable and ReactJS tie the knot
  9. Ruby, facing the change of world-wide server-class microprocessors
  10. 從零開始的爬蟲之旅
  11. Buidling HUGE web apps: Rails at 1,000,000 Lines of Code
  12. Solving your onboarding problems with Ruby
  13. Ruby, HTTP/2 and You
  14. What is the Rack Hijacking API
  15. Large scale Rails applications
  16. How we replaced salary negotiations with a Sinatra app

上面這些是我這次有聽的主題,只是免不了的,像我這種菜鳥,太技術的主題會滿頭問號
或者因為我沒碰過,所以沒有感覺
所以最後最喜歡的主題是How we replaced salary negotiations with a Sinatra app 或是To Code Is Human還有Solving your onboarding problems with Ruby之類的 XD
後者特別是因為吃飯的時候我聽到有人說他對新人問題問太多不耐煩(不過沒看到實際狀況其實沒辦法判斷是新人本身問題,還是指導的人本來就沒耐性)

中間時間也有去和有來擺攤的公司聊了一下,雖然,嗯........要我和其他與會者搭訕聊天還是有點困難冏我連人太多的早餐店都會不知道該怎麼插入阿阿阿阿阿
不過這幾天我講了好幾次為什麼我當初會選學ruby on rails,這個之後另外寫一篇好了(簡略版: 因為lang8)

這次還有Unconference,我自己對icook的一個實習生的主題很有興趣(其實我投過他們家履歷無回應,已哭),講的是他們想要算出每份料理的熱量,雖然我好像找不到簡報

這其實是我很想做的東西,畢竟雖然身為資管系畢業,但我最有印象的是當初選修的某個選修課,上課的是個營養師,從此我就一直記得每7700卡就會多一kg,還有脂肪細胞成年之後數量就固定了,所以小時候胖不是胖是錯的,課堂裡面當然也算過熱量要設計菜單之類的。(其實我根本讀錯系??!!)

只是我現在還沒能力做,畢竟大家的用語都不一樣,我覺得相比別的語言,比方說英文日文,中文常常一樣東西有更多種寫法,好比"milk",我可以寫鮮奶/牛奶/牛乳或者有些人直接用英文,那我程式要怎麼辦@@?或者新鮮草莓,但草莓就是草莓,我愛用冷凍的其實也不會影響到熱量,但是要自動算出程式考慮到那些字就會變得很麻煩
或者考慮到算出的精準度,食譜可能只寫"巧克力",但哪一種??大波露?meji?熱量就不會一樣了(雖然,本來這種東西就是只能算出大概的準確度,而且個人覺得誤差應該不小)
還有常見的"適量",雖然講真的誰做菜會知道自己到底量放多少,但,這樣就算不出來冏
等我哪天夠強,我是真的很想用個相關功能的網站(握拳)

還有五倍的蒼時弦也講的turbolinks入門, 雖然我目前我都還是把它關掉XD

最後.....要是明年可以去ruby kaigi就好了


還有就是........如開頭所講,我很容易負面想太多,所以當初我學ruby on rails的時候,因為當年大學同班的人沒人是寫這個的,就被我自己擴大成
"嗚嗚嗚...我覺得整個真理都找不到寫ruby on rails的"
對不起我是笨蛋(跪)
其實n年前對於女神轉生我就想過一樣的事了
之後我會相信凡事都有希望的XD




2016年12月1日 星期四

html: { multipart: true }

rails tutorial裡面再講圖片上傳的時候說form_for一定要加html: { multipart: true }這個參數
不過rails4開始form_for會自動加,form_tag才需要手動家的樣子

http://guides.rubyonrails.org/form_helpers.html#uploading-files

 If you use form_for, this is done automatically. If you use form_tag, you must set it yourself