Ecoer Logo

@linjiahung

40

Programmer, writer, lifelong learner

steemit.com/@linjiahung
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS49.77%
Net Worth
3.653USD
STEEM
0.026STEEM
SBD
7.145SBD
Effective Power
5.008SP
├── Own SP
3.822SP
└── Incoming Deleg
+1.185SP

Detailed Balance

STEEM
balance
0.026STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
3.822SP
Delegated Out
0.000SP
Delegation In
1.185SP
Effective Power
5.008SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
7.145SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "0.026 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "6216.014094 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "1927.645712 VESTS",
  "sbd_balance": "7.145 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

namelinjiahung
id489060
rank903,396
reputation52718592076
created2017-12-12T03:03:12
recovery_accountsteem
proxyNone
post_count57
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-10-16T16:07:45
last_root_post2018-10-16T16:07:45
last_vote_time2018-05-31T14:58:06
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.026 STEEM
savings_balance0.000 STEEM
sbd_balance7.145 SBD
savings_sbd_balance0.000 SBD
vesting_shares6216.014094 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares1927.645712 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2017-12-12T03:16:33
minedNo
sbd_seconds13,399,266,459
sbd_last_interest_payment2018-05-31T14:54:45
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5ikxHXmSd2EwaGc3EZEUTTe2z5NzhamyGNFs4oXTcayZFDA3PH",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "balance": "0.026 STEEM",
  "can_vote": true,
  "comment_count": 0,
  "created": "2017-12-12T03:03:12",
  "curation_rewards": 3,
  "delegated_vesting_shares": "0.000000 VESTS",
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779073152
  },
  "guest_bloggers": [],
  "id": 489060,
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://scontent.ftpe7-4.fna.fbcdn.net/v/t1.0-1/p160x160/12274451_1118296284856641_6343258697106219339_n.jpg?oh=11ec975e8fae084bb13568d465b6b7c4&oe=5AD132B5\",\"about\":\"Programmer, writer, lifelong learner\",\"location\":\"Taiwan\",\"website\":\"http://www.createyourownlives.com\"}}",
  "last_account_recovery": "1970-01-01T00:00:00",
  "last_account_update": "2017-12-12T03:16:33",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_post": "2018-10-16T16:07:45",
  "last_root_post": "2018-10-16T16:07:45",
  "last_vote_time": "2018-05-31T14:58:06",
  "lifetime_vote_count": 0,
  "market_history": [],
  "memo_key": "STM5YWn6xpzHhHKrvj2VdwyucSURRdp2XRBNrZfT1ifqbMiu8hz7M",
  "mined": false,
  "name": "linjiahung",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "other_history": [],
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8dXZeDd1vqhC4h5E7hLwWfSETFbyH4pZ2B386HtxbpGGST8TLW",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "pending_claimed_accounts": 0,
  "post_bandwidth": 0,
  "post_count": 57,
  "post_history": [],
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM7LHqjoK2xfkSmnBZ1mY7VPeN5zkMjfxPEnT3CmvNX4qqyjjEfW",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://scontent.ftpe7-4.fna.fbcdn.net/v/t1.0-1/p160x160/12274451_1118296284856641_6343258697106219339_n.jpg?oh=11ec975e8fae084bb13568d465b6b7c4&oe=5AD132B5\",\"about\":\"Programmer, writer, lifelong learner\",\"location\":\"Taiwan\",\"website\":\"http://www.createyourownlives.com\"}}",
  "posting_rewards": 5052,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "proxy": "",
  "received_vesting_shares": "1927.645712 VESTS",
  "recovery_account": "steem",
  "reputation": "52718592076",
  "reset_account": "null",
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "sbd_balance": "7.145 SBD",
  "sbd_last_interest_payment": "2018-05-31T14:54:45",
  "sbd_seconds": "13399266459",
  "sbd_seconds_last_update": "2018-06-23T15:23:12",
  "tags_usage": [],
  "to_withdraw": 0,
  "transfer_history": [],
  "vesting_balance": "0.000 STEEM",
  "vesting_shares": "6216.014094 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "vote_history": [],
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779073152
  },
  "voting_power": 0,
  "withdraw_routes": 0,
  "withdrawn": 0,
  "witness_votes": [],
  "witnesses_voted_for": 0,
  "rank": 903396
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 1.185 SP to @linjiahung
2026/05/18 02:59:12
delegateelinjiahung
delegatorsteem
vesting shares1927.645712 VESTS
Transaction InfoBlock #106146712/Trx f7d73793a3799ecf7a7777e1a7874761ab76938e
View Raw JSON Data
{
  "block": 106146712,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "1927.645712 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-18T02:59:12",
  "trx_id": "f7d73793a3799ecf7a7777e1a7874761ab76938e",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 1.002 SP to @linjiahung
2026/05/12 14:53:39
delegateelinjiahung
delegatorsteem
vesting shares1629.434820 VESTS
Transaction InfoBlock #105988944/Trx 184d07430056ce1df54ca6cb2eaa37b138558bfa
View Raw JSON Data
{
  "block": 105988944,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "1629.434820 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-12T14:53:39",
  "trx_id": "184d07430056ce1df54ca6cb2eaa37b138558bfa",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 1.193 SP to @linjiahung
2026/04/26 02:15:51
delegateelinjiahung
delegatorsteem
vesting shares1940.161468 VESTS
Transaction InfoBlock #105514287/Trx 68d3b7a2a27445358f9ef67da71671be2aaf82d8
View Raw JSON Data
{
  "block": 105514287,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "1940.161468 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-04-26T02:15:51",
  "trx_id": "68d3b7a2a27445358f9ef67da71671be2aaf82d8",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 1.071 SP to @linjiahung
2023/11/14 02:02:54
delegateelinjiahung
delegatorsteem
vesting shares1741.904685 VESTS
Transaction InfoBlock #79861047/Trx 5226af9732f2d4b394e8ab6122014968ace7f03e
View Raw JSON Data
{
  "block": 79861047,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "1741.904685 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-11-14T02:02:54",
  "trx_id": "5226af9732f2d4b394e8ab6122014968ace7f03e",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 1.554 SP to @linjiahung
2023/09/22 01:02:18
delegateelinjiahung
delegatorsteem
vesting shares2527.613641 VESTS
Transaction InfoBlock #78351669/Trx a050616994a921250f0737e7c44ee9f5446231f0
View Raw JSON Data
{
  "block": 78351669,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "2527.613641 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-09-22T01:02:18",
  "trx_id": "a050616994a921250f0737e7c44ee9f5446231f0",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 1.691 SP to @linjiahung
2022/11/03 14:26:18
delegateelinjiahung
delegatorsteem
vesting shares2749.295079 VESTS
Transaction InfoBlock #69116525/Trx e7993bc7b4bf88887e7e73a1a7839af9d2b7d313
View Raw JSON Data
{
  "block": 69116525,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "2749.295079 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-11-03T14:26:18",
  "trx_id": "e7993bc7b4bf88887e7e73a1a7839af9d2b7d313",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 1.826 SP to @linjiahung
2022/01/17 17:44:12
delegateelinjiahung
delegatorsteem
vesting shares2969.530215 VESTS
Transaction InfoBlock #60817511/Trx 125d9d0634d7bb7130748f8422b3f7fd7a6684d0
View Raw JSON Data
{
  "block": 60817511,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "2969.530215 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-01-17T17:44:12",
  "trx_id": "125d9d0634d7bb7130748f8422b3f7fd7a6684d0",
  "trx_in_block": 29,
  "virtual_op": 0
}
steemdelegated 1.939 SP to @linjiahung
2021/06/14 03:16:48
delegateelinjiahung
delegatorsteem
vesting shares3153.596968 VESTS
Transaction InfoBlock #54610664/Trx 4d60dfd78afb219538f9a43a096afef137724bbc
View Raw JSON Data
{
  "block": 54610664,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "3153.596968 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2021-06-14T03:16:48",
  "trx_id": "4d60dfd78afb219538f9a43a096afef137724bbc",
  "trx_in_block": 6,
  "virtual_op": 0
}
steemdelegated 2.054 SP to @linjiahung
2020/12/11 13:32:33
delegateelinjiahung
delegatorsteem
vesting shares3341.018942 VESTS
Transaction InfoBlock #49358031/Trx 62c22b458b424f249d69151ab2ee89e2aef417c9
View Raw JSON Data
{
  "block": 49358031,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "3341.018942 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-11T13:32:33",
  "trx_id": "62c22b458b424f249d69151ab2ee89e2aef417c9",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 1.176 SP to @linjiahung
2020/12/06 07:09:03
delegateelinjiahung
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #49209577/Trx 1da5417f8340836f66d2879888ca0d87361c71f1
View Raw JSON Data
{
  "block": 49209577,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "1912.543513 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-06T07:09:03",
  "trx_id": "1da5417f8340836f66d2879888ca0d87361c71f1",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 2.058 SP to @linjiahung
2020/12/05 17:10:33
delegateelinjiahung
delegatorsteem
vesting shares3347.226796 VESTS
Transaction InfoBlock #49193122/Trx f78e5213e03d3607efca9ec016a483a3fffd2456
View Raw JSON Data
{
  "block": 49193122,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "3347.226796 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-05T17:10:33",
  "trx_id": "f78e5213e03d3607efca9ec016a483a3fffd2456",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 1.181 SP to @linjiahung
2020/11/02 20:39:06
delegateelinjiahung
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #48263705/Trx a09d67578251f2039b5fc7c8960250bb54d79326
View Raw JSON Data
{
  "block": 48263705,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "1920.017158 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-11-02T20:39:06",
  "trx_id": "a09d67578251f2039b5fc7c8960250bb54d79326",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 2.183 SP to @linjiahung
2020/05/09 08:09:03
delegateelinjiahung
delegatorsteem
vesting shares3550.032155 VESTS
Transaction InfoBlock #43219857/Trx ed67b12b0f013a73a78a52dbb4457467ee0b2112
View Raw JSON Data
{
  "block": 43219857,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "3550.032155 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-09T08:09:03",
  "trx_id": "ed67b12b0f013a73a78a52dbb4457467ee0b2112",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 1.201 SP to @linjiahung
2020/05/08 12:07:00
delegateelinjiahung
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #43196385/Trx 7690a701e8cb8da0ad26fbd1c7466633a0ab02c4
View Raw JSON Data
{
  "block": 43196385,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "1953.311140 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-08T12:07:00",
  "trx_id": "7690a701e8cb8da0ad26fbd1c7466633a0ab02c4",
  "trx_in_block": 8,
  "virtual_op": 0
}
steemdelegated 2.232 SP to @linjiahung
2019/12/17 20:13:33
delegateelinjiahung
delegatorsteem
vesting shares3628.967666 VESTS
Transaction InfoBlock #39125334/Trx c68cc59e1486f55ef30a08f7908011078a9213ad
View Raw JSON Data
{
  "block": 39125334,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "3628.967666 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-12-17T20:13:33",
  "trx_id": "c68cc59e1486f55ef30a08f7908011078a9213ad",
  "trx_in_block": 26,
  "virtual_op": 0
}
2019/12/12 03:27:39
authorsteemitboard
bodyCongratulations @linjiahung! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@linjiahung/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@linjiahung) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=linjiahung)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorlinjiahung
parent permlink6v9omv
permlinksteemitboard-notify-linjiahung-20191212t032738000z
title
Transaction InfoBlock #38961520/Trx cff2f76c19aab778026d3776c37f1c8bfb2f0c7f
View Raw JSON Data
{
  "block": 38961520,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @linjiahung! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@linjiahung/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@linjiahung) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=linjiahung)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "linjiahung",
      "parent_permlink": "6v9omv",
      "permlink": "steemitboard-notify-linjiahung-20191212t032738000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-12-12T03:27:39",
  "trx_id": "cff2f76c19aab778026d3776c37f1c8bfb2f0c7f",
  "trx_in_block": 5,
  "virtual_op": 0
}
steemdelegated 2.353 SP to @linjiahung
2019/01/15 17:47:48
delegateelinjiahung
delegatorsteem
vesting shares3825.897920 VESTS
Transaction InfoBlock #29483348/Trx 5616e26d5561661954b95dac701aeb9c58ef336e
View Raw JSON Data
{
  "block": 29483348,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "3825.897920 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-01-15T17:47:48",
  "trx_id": "5616e26d5561661954b95dac701aeb9c58ef336e",
  "trx_in_block": 3,
  "virtual_op": 0
}
2018/12/12 03:21:54
authorsteemitboard
bodyCongratulations @linjiahung! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@linjiahung/birthday1.png</td><td>1 Year on Steemit</td></tr></table> <sub>_[Click here to view your Board of Honor](https://steemitboard.com/@linjiahung)_</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorlinjiahung
parent permlink6v9omv
permlinksteemitboard-notify-linjiahung-20181212t032154000z
title
Transaction InfoBlock #28487569/Trx ef77c058dbbe1bea76023c344266875b2ed2691c
View Raw JSON Data
{
  "block": 28487569,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @linjiahung! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@linjiahung/birthday1.png</td><td>1 Year on Steemit</td></tr></table>\n\n<sub>_[Click here to view your Board of Honor](https://steemitboard.com/@linjiahung)_</sub>\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "linjiahung",
      "parent_permlink": "6v9omv",
      "permlink": "steemitboard-notify-linjiahung-20181212t032154000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-12-12T03:21:54",
  "trx_id": "ef77c058dbbe1bea76023c344266875b2ed2691c",
  "trx_in_block": 8,
  "virtual_op": 0
}
fastresteemupvoted (1.00%) @linjiahung / 6v9omv
2018/10/16 16:07:54
authorlinjiahung
permlink6v9omv
voterfastresteem
weight100 (1.00%)
Transaction InfoBlock #26862307/Trx 5c31719d129ee57bc06f89256b4890642e24414f
View Raw JSON Data
{
  "block": 26862307,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "6v9omv",
      "voter": "fastresteem",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-16T16:07:54",
  "trx_id": "5c31719d129ee57bc06f89256b4890642e24414f",
  "trx_in_block": 6,
  "virtual_op": 0
}
linjiahungpublished a new post: 6v9omv
2018/10/16 16:07:45
authorlinjiahung
body![money-money-money-free-license-cc0_resized (1).jpg](https://cdn.steemitimages.com/DQmWt6j6RRb7bqRmMe87Bz1nkXZymbpo4kbMhRKLVUNw2ef/money-money-money-free-license-cc0_resized%20(1).jpg) > 什麼是稀缺? 所謂的稀缺,就是你實際擁有的,比你認為你需要的還少。 > 實際擁有 < 認為自己需要的 稀缺並不只是一個現象,更會對心智造成影響。 > 一個實驗找來一群孩童,讓他們憑印象去預估不同尺寸的硬幣大小—從1便士到0.5美元。對於那些比較貧困的孩童的印象中,他們認為硬幣的大小,往往比經濟狀況較好的孩童認為來得「更大」。尤其是那些價值更高的硬幣—0.25美元和0.5美元,誤差更是「大」的許多。 > > 就像對於飢餓的人來說,食物的念頭會佔去他們的腦海。而對於較為貧困的孩童來說,硬幣同樣的也更吸引他們的注意力。而更多的注意力,讓硬幣在他們眼中顯得較為巨大。 > > 當然,較貧困的孩童有可能是因為較少接觸硬幣的機會,而對於從印象判斷硬幣大小出現失真的情況。但是即便研究人員在孩童的面前放置了真實的硬幣、並要求評估大小,較貧困的孩童還是出現了預測大小過大的情況,而誤差的範圍甚至比憑印象更大。 > > 但是有趣的是,當移除了金錢,改要求孩童們評估紙板的大小時,不論經濟狀況,兩群小孩都能夠足夠準確的判斷大小。 ## 當投資影響了你的生活 對很多人來說,當他們在投資時,往往會拿出一大筆錢投資到他們認為會賺錢的標的上,預期能夠很快的狠狠賺上一筆。但是現實是,投資這件事本來就是充滿了風險,有些人賺錢、有些人賠錢。 當自己是賠錢的那個人時,因為手頭上擁有的金錢大幅減少,就很容易產生稀缺的心理,進而影響到生活跟未來的決策。 但是不論是對自我、或是資產的投資,都是讓一個人的生活條件越來越好的一種方式。如果想要生活有所不同,投資就不可或缺。 不過就像是上面所說的,投資這件事本身就是伴隨著風險。否則就不會有那句著名的廣告詞: >「投資一定有風險,基金投資有賺有賠,申購前應詳閱公開說明書。」 所以在投資這件事來說,最好是拿出一筆即便你損失也不會心痛的錢來做投資。 舉例來說,曾經在「通往財富自由之路」這本書中看到這麼一段話 > 心理學家透過大量的調查研究,得到了這個一個結論 > * 三分之二以上的人若丟失了自己年收入的10%... > * 二分之一以上的人若丟失了自己年收入的20%... > > 都不會影響自己的生活品質 所以以上述的例子來說,一個年收入50萬的人,拿出5萬塊來做投資,並把這個金額判無期徒刑。如果真的損失了,很大的機率也不會影響自己的生活品質。 就我自己的經驗來說,我發現透過這種方式投資,會讓自己不被損失金錢的情緒給綁架,因為被我判「無期徒刑」的錢即便真的損失了,也是我可以承受的範圍。 ## 投資的目的應該是... 投資雖然是一種讓我們生活變得更好的方式,但是如果反過頭來讓投資影響到了我們的生活,那不是就本末導致了嗎?
json metadata{"tags":["cn","cn-reader","blog","money","writting"],"image":["https://cdn.steemitimages.com/DQmWt6j6RRb7bqRmMe87Bz1nkXZymbpo4kbMhRKLVUNw2ef/money-money-money-free-license-cc0_resized%20(1).jpg"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlink6v9omv
title為你自己的投資判「無期徒刑」
Transaction InfoBlock #26862304/Trx 6ece87125c0c289b2a4b266f98e307e3e069daa3
View Raw JSON Data
{
  "block": 26862304,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![money-money-money-free-license-cc0_resized (1).jpg](https://cdn.steemitimages.com/DQmWt6j6RRb7bqRmMe87Bz1nkXZymbpo4kbMhRKLVUNw2ef/money-money-money-free-license-cc0_resized%20(1).jpg)\n> 什麼是稀缺?\n\n所謂的稀缺,就是你實際擁有的,比你認為你需要的還少。\n\n> 實際擁有 < 認為自己需要的\n\n稀缺並不只是一個現象,更會對心智造成影響。\n\n> 一個實驗找來一群孩童,讓他們憑印象去預估不同尺寸的硬幣大小—從1便士到0.5美元。對於那些比較貧困的孩童的印象中,他們認為硬幣的大小,往往比經濟狀況較好的孩童認為來得「更大」。尤其是那些價值更高的硬幣—0.25美元和0.5美元,誤差更是「大」的許多。\n>\n> 就像對於飢餓的人來說,食物的念頭會佔去他們的腦海。而對於較為貧困的孩童來說,硬幣同樣的也更吸引他們的注意力。而更多的注意力,讓硬幣在他們眼中顯得較為巨大。\n>\n> 當然,較貧困的孩童有可能是因為較少接觸硬幣的機會,而對於從印象判斷硬幣大小出現失真的情況。但是即便研究人員在孩童的面前放置了真實的硬幣、並要求評估大小,較貧困的孩童還是出現了預測大小過大的情況,而誤差的範圍甚至比憑印象更大。\n>\n> 但是有趣的是,當移除了金錢,改要求孩童們評估紙板的大小時,不論經濟狀況,兩群小孩都能夠足夠準確的判斷大小。\n## 當投資影響了你的生活\n對很多人來說,當他們在投資時,往往會拿出一大筆錢投資到他們認為會賺錢的標的上,預期能夠很快的狠狠賺上一筆。但是現實是,投資這件事本來就是充滿了風險,有些人賺錢、有些人賠錢。\n\n當自己是賠錢的那個人時,因為手頭上擁有的金錢大幅減少,就很容易產生稀缺的心理,進而影響到生活跟未來的決策。\n\n但是不論是對自我、或是資產的投資,都是讓一個人的生活條件越來越好的一種方式。如果想要生活有所不同,投資就不可或缺。\n\n不過就像是上面所說的,投資這件事本身就是伴隨著風險。否則就不會有那句著名的廣告詞:\n>「投資一定有風險,基金投資有賺有賠,申購前應詳閱公開說明書。」\n\n所以在投資這件事來說,最好是拿出一筆即便你損失也不會心痛的錢來做投資。\n\n舉例來說,曾經在「通往財富自由之路」這本書中看到這麼一段話\n> 心理學家透過大量的調查研究,得到了這個一個結論\n> * 三分之二以上的人若丟失了自己年收入的10%...\n> * 二分之一以上的人若丟失了自己年收入的20%...\n>\n> 都不會影響自己的生活品質\n\n\n所以以上述的例子來說,一個年收入50萬的人,拿出5萬塊來做投資,並把這個金額判無期徒刑。如果真的損失了,很大的機率也不會影響自己的生活品質。\n\n\n就我自己的經驗來說,我發現透過這種方式投資,會讓自己不被損失金錢的情緒給綁架,因為被我判「無期徒刑」的錢即便真的損失了,也是我可以承受的範圍。\n## 投資的目的應該是... \n投資雖然是一種讓我們生活變得更好的方式,但是如果反過頭來讓投資影響到了我們的生活,那不是就本末導致了嗎?",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"money\",\"writting\"],\"image\":[\"https://cdn.steemitimages.com/DQmWt6j6RRb7bqRmMe87Bz1nkXZymbpo4kbMhRKLVUNw2ef/money-money-money-free-license-cc0_resized%20(1).jpg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "6v9omv",
      "title": "為你自己的投資判「無期徒刑」"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-16T16:07:45",
  "trx_id": "6ece87125c0c289b2a4b266f98e307e3e069daa3",
  "trx_in_block": 8,
  "virtual_op": 0
}
linjiahungpublished a new post: 2jaxnm
2018/10/12 14:04:12
authorlinjiahung
bodyhttps://cdn-images-1.medium.com/max/800/1*WqRhRXnHruicPo5NAL32vw.jpeg 公司每個月的營業額很高,就是真的賺錢嗎?每次公司業績不好,就想透過促銷的方式來衝業績,但你知道你可能反而因此虧大了嗎? 假設今天你是「好棒棒」花店的老闆,你滿腦子想的都是如何提升公司的業績,讓公司可以賺更多錢,這樣你和員工的家人才會有更多的收入過上好的日子。 今天你們公司的主力且唯一個商品是送禮的盆花,一個售價2000元,而每個月都可以賣出100盆。由於最近店內的業績一直不好,營業額不好看。 所以為了衝高業績,你就在思考,是不是能夠把商品降價出售,以吸引更多人上門來光顧。也因此,你就在心中默默的盤算要把商品打9折,然後搭配廣告來曝光、衝高銷售。 降價促銷一直是很多商家用來提升業績的方法,但是這個方法並不一定適用在所有商家。如果沒有事先做功課的話,當你商品降價後,雖然業績可能提升了,但是公司反而有可能是虧錢的! ## 利用微利額和微利率檢視你的生意 在這邊我們用幾個公式來舉例,在「數字力就是賺錢力」這本書中有提到幾個有趣的公式,分別是微利、微利率和變動額 > 微利額 = 銷售額 - 變動費額 > >變動費額 = 固定成本 + 變動成本 > >微利率 = 微利額 / 銷售額 註:在書中變動費額這個名詞似乎翻得不太精確,因為變動費額看起來是變動費用,但是在書中卻是固定成本 + 變動成本。所以這邊我就直接把變動費額的計算方式寫出來,避免混淆。 以「好棒棒」花店的主力商品來說,盆花的固定成本是1000;變動成本是100元的籃子、100元的盆子還有400元的配送費。所以這個盆花的微利額就是 > 2000 -1000 - ( 100 + 100 + 400 ) = 400元 而微利率則是 > 400 / 2000 = 20% 如果說「好棒棒」一個月可以賣出100盆花,那該月的微利額就是 > 100 X 400 = 40,000元 ## 降價促銷的陷阱 正因為每個月的微利額只有4萬,你希望可以增加收入,所以你就在思考不如把商品打個9折吧?但是這樣的想法可能正是造成虧損的開始。 當你想說要打9折促銷時,你的微利就會從400降到200,微利率也會變成11.11%(200 / 1800)。在你降價的情況下,如果你要達到跟原本售價的商品一樣的微利額,那你必須要賣出2倍的商品。 > 40,000 / 200 = 200。 > > 原先的微利額 / 微利 = 銷售數量 所以本來賣出100盆花,就可以達到4萬的微利額。在打9折的情況下,卻需要賣出200盆花才有可能達到相同的微利額。 即便你真的賣出了200盆花,而且你的營業額從本來的20萬(2000 X 100 = 200,000),變成了後來的36萬(1800 X 200 = 360,000),但是你可能會發現一件很可怕的事情,那就是 > 「雖然整個月的營業額增加了,但是事實上公司可能虧錢了」。 因為雖然你的營業額是1倍多,但是你的淨收入是一樣的。而且工作量增加兩倍的情況下,商家勢必要增加人手、或是延長工時。這部分的人事費用支出完全會把利潤給侵蝕掉。另外,如果你有打廣告的話,還要另外再加上廣告費呢。 所以這就是為什麼會說「你以為你賺錢了,但實際上你虧大了」,還有「數學真的很重要」的原因。 如果你是做生意的商家,在打折之前記得花點時間計算自家的微利率、打折後的銷售數、廣告費,還有可能的人事支出。事先的計算,可以避免整個活動跑完的虧損,以及最後累得半死但是看到帳戶金額減少的心理衝擊。
json metadata{"tags":["cn","cn-reader","blog","money","business"],"image":["https://cdn-images-1.medium.com/max/800/1*WqRhRXnHruicPo5NAL32vw.jpeg"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlink2jaxnm
title商品大賣讓你以為你賺錢了,但實際上你可能虧大了
Transaction InfoBlock #26744722/Trx 0319c0da5367cf31b5077c83ad7d429f0b8a7a9c
View Raw JSON Data
{
  "block": 26744722,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "https://cdn-images-1.medium.com/max/800/1*WqRhRXnHruicPo5NAL32vw.jpeg\n\n公司每個月的營業額很高,就是真的賺錢嗎?每次公司業績不好,就想透過促銷的方式來衝業績,但你知道你可能反而因此虧大了嗎?\n\n假設今天你是「好棒棒」花店的老闆,你滿腦子想的都是如何提升公司的業績,讓公司可以賺更多錢,這樣你和員工的家人才會有更多的收入過上好的日子。\n\n今天你們公司的主力且唯一個商品是送禮的盆花,一個售價2000元,而每個月都可以賣出100盆。由於最近店內的業績一直不好,營業額不好看。\n\n所以為了衝高業績,你就在思考,是不是能夠把商品降價出售,以吸引更多人上門來光顧。也因此,你就在心中默默的盤算要把商品打9折,然後搭配廣告來曝光、衝高銷售。\n\n\n降價促銷一直是很多商家用來提升業績的方法,但是這個方法並不一定適用在所有商家。如果沒有事先做功課的話,當你商品降價後,雖然業績可能提升了,但是公司反而有可能是虧錢的!\n## 利用微利額和微利率檢視你的生意\n在這邊我們用幾個公式來舉例,在「數字力就是賺錢力」這本書中有提到幾個有趣的公式,分別是微利、微利率和變動額\n> 微利額 = 銷售額 - 變動費額\n>\n>變動費額 = 固定成本 + 變動成本\n>\n>微利率 = 微利額 / 銷售額\n\n註:在書中變動費額這個名詞似乎翻得不太精確,因為變動費額看起來是變動費用,但是在書中卻是固定成本 + 變動成本。所以這邊我就直接把變動費額的計算方式寫出來,避免混淆。\n\n以「好棒棒」花店的主力商品來說,盆花的固定成本是1000;變動成本是100元的籃子、100元的盆子還有400元的配送費。所以這個盆花的微利額就是\n\n> 2000 -1000 - ( 100 + 100 + 400 ) = 400元\n\n而微利率則是\n\n> 400 / 2000 = 20%\n\n如果說「好棒棒」一個月可以賣出100盆花,那該月的微利額就是\n\n> 100 X 400 = 40,000元\n\n## 降價促銷的陷阱\n\n正因為每個月的微利額只有4萬,你希望可以增加收入,所以你就在思考不如把商品打個9折吧?但是這樣的想法可能正是造成虧損的開始。\n\n當你想說要打9折促銷時,你的微利就會從400降到200,微利率也會變成11.11%(200 / 1800)。在你降價的情況下,如果你要達到跟原本售價的商品一樣的微利額,那你必須要賣出2倍的商品。\n\n> 40,000 / 200 = 200。\n> \n> 原先的微利額 / 微利 = 銷售數量\n\n所以本來賣出100盆花,就可以達到4萬的微利額。在打9折的情況下,卻需要賣出200盆花才有可能達到相同的微利額。\n\n即便你真的賣出了200盆花,而且你的營業額從本來的20萬(2000 X 100 = 200,000),變成了後來的36萬(1800 X 200 = 360,000),但是你可能會發現一件很可怕的事情,那就是\n\n> 「雖然整個月的營業額增加了,但是事實上公司可能虧錢了」。\n\n因為雖然你的營業額是1倍多,但是你的淨收入是一樣的。而且工作量增加兩倍的情況下,商家勢必要增加人手、或是延長工時。這部分的人事費用支出完全會把利潤給侵蝕掉。另外,如果你有打廣告的話,還要另外再加上廣告費呢。\n\n所以這就是為什麼會說「你以為你賺錢了,但實際上你虧大了」,還有「數學真的很重要」的原因。\n\n如果你是做生意的商家,在打折之前記得花點時間計算自家的微利率、打折後的銷售數、廣告費,還有可能的人事支出。事先的計算,可以避免整個活動跑完的虧損,以及最後累得半死但是看到帳戶金額減少的心理衝擊。",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"money\",\"business\"],\"image\":[\"https://cdn-images-1.medium.com/max/800/1*WqRhRXnHruicPo5NAL32vw.jpeg\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "2jaxnm",
      "title": "商品大賣讓你以為你賺錢了,但實際上你可能虧大了"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-12T14:04:12",
  "trx_id": "0319c0da5367cf31b5077c83ad7d429f0b8a7a9c",
  "trx_in_block": 41,
  "virtual_op": 0
}
steemdelegated 14.804 SP to @linjiahung
2018/10/08 17:19:09
delegateelinjiahung
delegatorsteem
vesting shares24074.030678 VESTS
Transaction InfoBlock #26633507/Trx e9e368399fd5045cd9b96cd744801735a8320524
View Raw JSON Data
{
  "block": 26633507,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "24074.030678 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-08T17:19:09",
  "trx_id": "e9e368399fd5045cd9b96cd744801735a8320524",
  "trx_in_block": 10,
  "virtual_op": 0
}
xiaoshancunupvoted (100.00%) @linjiahung / 4g2zws
2018/10/07 09:01:03
authorlinjiahung
permlink4g2zws
voterxiaoshancun
weight10000 (100.00%)
Transaction InfoBlock #26594764/Trx 92b2ed50ee58906d0c638eea32ea02cffaf837db
View Raw JSON Data
{
  "block": 26594764,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "4g2zws",
      "voter": "xiaoshancun",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-07T09:01:03",
  "trx_id": "92b2ed50ee58906d0c638eea32ea02cffaf837db",
  "trx_in_block": 19,
  "virtual_op": 0
}
alphabotupvoted (1.00%) @linjiahung / 4g2zws
2018/10/07 08:33:06
authorlinjiahung
permlink4g2zws
voteralphabot
weight100 (1.00%)
Transaction InfoBlock #26594205/Trx 81bebfaf59d5353b9dc18583d0e93708c9057f50
View Raw JSON Data
{
  "block": 26594205,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "4g2zws",
      "voter": "alphabot",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-07T08:33:06",
  "trx_id": "81bebfaf59d5353b9dc18583d0e93708c9057f50",
  "trx_in_block": 7,
  "virtual_op": 0
}
linjiahungpublished a new post: 4g2zws
2018/10/07 08:32:57
authorlinjiahung
body![startup-849804_640.jpg](https://cdn.steemitimages.com/DQmaw2GUJiY93v9yqvNKmpfqtaYwuEi7ybvKTEUHRzZx3QQ/startup-849804_640.jpg) 最近在思考要如何前進人生的下個階段時,常常會覺得很徬徨,腦海裡完全不知道該如何做才好。 正當我在煩惱自己到底該怎麼辦才好時,我突然想到平常在寫程式的時候,雖然在執行的過程也會遇到種種的困難,但最後基本上總是能夠迎刃而解。 所以我開始好奇:「為什麼寫程式的時候可以解決各種問題,但是面對自己的人生的時候卻常常不知道該如何下手?」 雖然只是工作不久的網頁工程師,但是我發現不論是自己或是公司開發專案時,往往會經歷以下的幾個階段來開發專案 > 1. 接到一個新的專案需求 > 2. 確認這個專案的截止期限是什麼時候 > 3. 思考為了完成這個專案,要個別完成哪些功能? > 4. 這些個別的功能需要花上多少時間? > 5. 這個專案完成的時間,會不會超出截止期限? > 6. 超出的話,是要刪除部分功能、延長專案截止期限,又或者是熬夜加班趕上時程? > 7. 開始開發 ![workplace-1245776_640.jpg](https://cdn.steemitimages.com/DQmZgDiQMkb2oMmCdsXDBehtzoHfCNsKnp4NHtdoGWSFNnc/workplace-1245776_640.jpg) 工作分配下來之後,難免會遇到一些不熟悉、或是不知道該怎麼實作的功能,而這個部分其實是最困難也最花時間的部分。 因為很多時候你並不知道該怎麼完成這個功能,但是你又不得不完成。如果這個功能太複雜、一開始不知道怎麼入手的話,那就試著「再」把這個功能拆成更小的功能。 接著就是自己研究、上網找資料,或是請教別人;如果花了很多時間還是沒辦法解決,那可以先放下手頭的工作,先去完成其他功能,之後再回頭補上。 一個小功能完成之後,就接著去完成下一個小功能。最後當所有人(或是你自己一個人)把所有的功能都完成之後,這個專案大致上就算是完成了。 所以我在想,如果用程式開發的各個階段來檢視人生的話,會不會也可以使用類似的方法? ## 用類似的思維思考人生 接著就讓我們假設,如果我想達成「財富自由」這個目標,我要如何用類似的方法來拆解並執行? > 1. 開始思考要如何完成財富自由這個目標 > 2. Q:我要在什麼時候完成這些目標?A:45歲前 > 3. Q:為了完成這個目標,我需要個別完成什麼小目標?A:經營公司、投資、儲蓄、版稅 > 4. A:經營公司應該要花上數十年;要有好的投資成果,可能要花上N年;版稅可能是M年;儲蓄則是Y年 > 5. Q:我在45歲前能夠達成這個目標嗎?A:可以 > 6. Q:時程應該不會延後,所以不用擔心時程的問題 > 7. 開始執行 當我經歷了以上的規劃階段之後,我的大目標和中目標分別是 > 大目標:財富自由 > 中目標:經營公司、投資、儲蓄、版稅 假設現在的我要開始執行經營公司這個中目標,但是我不知道該如何下手,那這時候我該怎麼辦?這時候比較好的做好,可能是先研究並拆解經營公司這個中目標成更多小目標,像是: > 1. 我要賣什麼產品? > 2. 什麼樣的商業模式? > 3. 需要補足什麼樣的能力? > 4. 有多少的時間可以執行? > 5. 要如何執行? 當我這樣一一拆解之後,會發現事實上要完成這個經營公司這個中目標,還有許多的小目標要做。接下來我要做的,就是跟上面程式開發要做的事情類似。 一一的完成這些小目標。如果不知道該怎麼執行,那就研究、請教;如果花了很多時間還是沒辦法解決,那可以先放下手頭的工作,先去完成其他目標,之後再回頭補上。 ![business-891339_640.png](https://cdn.steemitimages.com/DQmPtBoKAv7Yrj33839mpPXLHvgtVUoYPs4VMQ53BFzTyK7/business-891339_640.png) 最後所有的功能都完成之後,這個目標大致上就算是完成了。 在推敲的過程中我發現,我(或是其他人)之所以沒有辦法去完成人生中的目標,往往原因出在 > 1. 不知道自己真正要的是什麼(沒有在日常中為了目標努力一點一滴的努力 > 2. 沒辦法去拆解出要完成目標需要額外做哪些事(不知道實際上該做些什麼才能達成目標 > 3. 遇到困難中途就放棄(太快就投降,沒有花足夠的時間去執行 但是如果我們可以透過專案開發的流程,來幫助自己分析人生的目標並執行的話,至少可以讓自己更明確的知道自己究竟缺少了什麼,也知道要如何分析並拆解目標。 接下來要做的,就是一步一步的完成目標;如果遇到了問題,那就是研究、分析或是請教他人,接著去執行。我們在解決問題的過程,很有可能會發現新的問題、或是發現自己可能根本一開始就想錯了。 但是沒有關係,我們可以暫停並整理目前遇到的問題,然後思考下一步要怎麼做。整理完思緒、擬定了下一步的策略後,那就繼續解決剩下的問題。 在程式開發的過程中,往往不會一帆風順,可能會為了幾個小問題花上大量的時間。雖然在開發的過程往往會遇到許多困難,但是總會找到解決問題的方法。 而我想,人生應該也適用一樣的原則: > 雖然過程中會遇到許多困難,但是只要靜下心來思考、研究然後開始執行,總會找到解決問題的方法的。
json metadata{"tags":["cn","cn-reader","blog","life","writting"],"image":["https://cdn.steemitimages.com/DQmaw2GUJiY93v9yqvNKmpfqtaYwuEi7ybvKTEUHRzZx3QQ/startup-849804_640.jpg","https://cdn.steemitimages.com/DQmZgDiQMkb2oMmCdsXDBehtzoHfCNsKnp4NHtdoGWSFNnc/workplace-1245776_640.jpg","https://cdn.steemitimages.com/DQmPtBoKAv7Yrj33839mpPXLHvgtVUoYPs4VMQ53BFzTyK7/business-891339_640.png"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlink4g2zws
title用程式開發思維幫助思考人生
Transaction InfoBlock #26594202/Trx 21fff01de08eb24d8f4a5515fad9129ac87bcf35
View Raw JSON Data
{
  "block": 26594202,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![startup-849804_640.jpg](https://cdn.steemitimages.com/DQmaw2GUJiY93v9yqvNKmpfqtaYwuEi7ybvKTEUHRzZx3QQ/startup-849804_640.jpg)\n\n最近在思考要如何前進人生的下個階段時,常常會覺得很徬徨,腦海裡完全不知道該如何做才好。\n\n正當我在煩惱自己到底該怎麼辦才好時,我突然想到平常在寫程式的時候,雖然在執行的過程也會遇到種種的困難,但最後基本上總是能夠迎刃而解。\n\n所以我開始好奇:「為什麼寫程式的時候可以解決各種問題,但是面對自己的人生的時候卻常常不知道該如何下手?」\n\n雖然只是工作不久的網頁工程師,但是我發現不論是自己或是公司開發專案時,往往會經歷以下的幾個階段來開發專案\n\n> 1. 接到一個新的專案需求\n> 2. 確認這個專案的截止期限是什麼時候\n> 3. 思考為了完成這個專案,要個別完成哪些功能?\n> 4. 這些個別的功能需要花上多少時間?\n> 5. 這個專案完成的時間,會不會超出截止期限?\n> 6. 超出的話,是要刪除部分功能、延長專案截止期限,又或者是熬夜加班趕上時程?\n> 7. 開始開發\n\n![workplace-1245776_640.jpg](https://cdn.steemitimages.com/DQmZgDiQMkb2oMmCdsXDBehtzoHfCNsKnp4NHtdoGWSFNnc/workplace-1245776_640.jpg)\n\n工作分配下來之後,難免會遇到一些不熟悉、或是不知道該怎麼實作的功能,而這個部分其實是最困難也最花時間的部分。\n\n因為很多時候你並不知道該怎麼完成這個功能,但是你又不得不完成。如果這個功能太複雜、一開始不知道怎麼入手的話,那就試著「再」把這個功能拆成更小的功能。\n\n接著就是自己研究、上網找資料,或是請教別人;如果花了很多時間還是沒辦法解決,那可以先放下手頭的工作,先去完成其他功能,之後再回頭補上。\n\n一個小功能完成之後,就接著去完成下一個小功能。最後當所有人(或是你自己一個人)把所有的功能都完成之後,這個專案大致上就算是完成了。\n\n\n所以我在想,如果用程式開發的各個階段來檢視人生的話,會不會也可以使用類似的方法?\n## 用類似的思維思考人生\n接著就讓我們假設,如果我想達成「財富自由」這個目標,我要如何用類似的方法來拆解並執行?\n\n> 1. 開始思考要如何完成財富自由這個目標\n> 2. Q:我要在什麼時候完成這些目標?A:45歲前\n> 3. Q:為了完成這個目標,我需要個別完成什麼小目標?A:經營公司、投資、儲蓄、版稅\n> 4. A:經營公司應該要花上數十年;要有好的投資成果,可能要花上N年;版稅可能是M年;儲蓄則是Y年\n> 5. Q:我在45歲前能夠達成這個目標嗎?A:可以\n> 6. Q:時程應該不會延後,所以不用擔心時程的問題\n> 7. 開始執行\n\n當我經歷了以上的規劃階段之後,我的大目標和中目標分別是\n\n> 大目標:財富自由\n> 中目標:經營公司、投資、儲蓄、版稅\n\n假設現在的我要開始執行經營公司這個中目標,但是我不知道該如何下手,那這時候我該怎麼辦?這時候比較好的做好,可能是先研究並拆解經營公司這個中目標成更多小目標,像是:\n> 1. 我要賣什麼產品?\n> 2. 什麼樣的商業模式?\n> 3. 需要補足什麼樣的能力?\n> 4. 有多少的時間可以執行?\n> 5. 要如何執行?\n\n當我這樣一一拆解之後,會發現事實上要完成這個經營公司這個中目標,還有許多的小目標要做。接下來我要做的,就是跟上面程式開發要做的事情類似。\n\n一一的完成這些小目標。如果不知道該怎麼執行,那就研究、請教;如果花了很多時間還是沒辦法解決,那可以先放下手頭的工作,先去完成其他目標,之後再回頭補上。\n![business-891339_640.png](https://cdn.steemitimages.com/DQmPtBoKAv7Yrj33839mpPXLHvgtVUoYPs4VMQ53BFzTyK7/business-891339_640.png)\n\n最後所有的功能都完成之後,這個目標大致上就算是完成了。\n\n\n在推敲的過程中我發現,我(或是其他人)之所以沒有辦法去完成人生中的目標,往往原因出在\n\n> 1. 不知道自己真正要的是什麼(沒有在日常中為了目標努力一點一滴的努力\n> 2. 沒辦法去拆解出要完成目標需要額外做哪些事(不知道實際上該做些什麼才能達成目標\n> 3. 遇到困難中途就放棄(太快就投降,沒有花足夠的時間去執行\n\n但是如果我們可以透過專案開發的流程,來幫助自己分析人生的目標並執行的話,至少可以讓自己更明確的知道自己究竟缺少了什麼,也知道要如何分析並拆解目標。\n\n接下來要做的,就是一步一步的完成目標;如果遇到了問題,那就是研究、分析或是請教他人,接著去執行。我們在解決問題的過程,很有可能會發現新的問題、或是發現自己可能根本一開始就想錯了。\n\n但是沒有關係,我們可以暫停並整理目前遇到的問題,然後思考下一步要怎麼做。整理完思緒、擬定了下一步的策略後,那就繼續解決剩下的問題。\n\n在程式開發的過程中,往往不會一帆風順,可能會為了幾個小問題花上大量的時間。雖然在開發的過程往往會遇到許多困難,但是總會找到解決問題的方法。\n\n而我想,人生應該也適用一樣的原則:\n> 雖然過程中會遇到許多困難,但是只要靜下心來思考、研究然後開始執行,總會找到解決問題的方法的。",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"life\",\"writting\"],\"image\":[\"https://cdn.steemitimages.com/DQmaw2GUJiY93v9yqvNKmpfqtaYwuEi7ybvKTEUHRzZx3QQ/startup-849804_640.jpg\",\"https://cdn.steemitimages.com/DQmZgDiQMkb2oMmCdsXDBehtzoHfCNsKnp4NHtdoGWSFNnc/workplace-1245776_640.jpg\",\"https://cdn.steemitimages.com/DQmPtBoKAv7Yrj33839mpPXLHvgtVUoYPs4VMQ53BFzTyK7/business-891339_640.png\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "4g2zws",
      "title": "用程式開發思維幫助思考人生"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-10-07T08:32:57",
  "trx_id": "21fff01de08eb24d8f4a5515fad9129ac87bcf35",
  "trx_in_block": 11,
  "virtual_op": 0
}
steemdelegated 2.392 SP to @linjiahung
2018/09/22 17:03:39
delegateelinjiahung
delegatorsteem
vesting shares3889.318011 VESTS
Transaction InfoBlock #26172890/Trx 4804ab76551f43b4de6a2ad531032165fe801ada
View Raw JSON Data
{
  "block": 26172890,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "3889.318011 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-22T17:03:39",
  "trx_id": "4804ab76551f43b4de6a2ad531032165fe801ada",
  "trx_in_block": 13,
  "virtual_op": 0
}
steemdelegated 14.910 SP to @linjiahung
2018/06/23 19:00:27
delegateelinjiahung
delegatorsteem
vesting shares24246.083679 VESTS
Transaction InfoBlock #23581504/Trx 7fc713b266c626f12bcf59dc63ddc3f0b4aa0e78
View Raw JSON Data
{
  "block": 23581504,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "24246.083679 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-23T19:00:27",
  "trx_id": "7fc713b266c626f12bcf59dc63ddc3f0b4aa0e78",
  "trx_in_block": 6,
  "virtual_op": 0
}
huangtongtupvoted (100.00%) @linjiahung / 6ee1mk
2018/06/23 15:30:27
authorlinjiahung
permlink6ee1mk
voterhuangtongt
weight10000 (100.00%)
Transaction InfoBlock #23577304/Trx 3d17dda597de3abc805143b33618a47a3b0b5e23
View Raw JSON Data
{
  "block": 23577304,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "6ee1mk",
      "voter": "huangtongt",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-23T15:30:27",
  "trx_id": "3d17dda597de3abc805143b33618a47a3b0b5e23",
  "trx_in_block": 21,
  "virtual_op": 0
}
linjiahungpublished a new post: 6ee1mk
2018/06/23 15:28:39
authorlinjiahung
body![](https://i.imgur.com/mrS4ojL.jpg) 圖片取自[pixabay](https://pixabay.com/en/mirror-woman-female-combing-hair-81780/),CC License 前兩天看到一篇[貼文](https://www.facebook.com/mindy.huang.7370/posts/10156712460064614),內容主要是闡述PCHome創辦人詹宏志先生,在面對蝦皮的競爭時,如何去用對手的思考模式思考,並分析對手的目的和策略,然後進一步地找出反擊的策略。 > 最後我想特別留一段來說明我覺得今晚最重要的觀念,就是「想像你的對手怎麼思考」。詹宏志為什麼可以看出蝦皮的目的和策略?因為他很努力的把自己塞到蝦皮的角度,試著揣測蝦皮的想法。具體要怎麼做呢?最直接的方式就是「講對方的語言」。 > > 每個時代的新創都有一套新的營運指標,這些指標就是「公司的語言」。例如蝦皮不講月營業額,講的是「年化營業額」,就是把一年之中營業額最高的那個月份直接乘以12。這完全不是PChome的方法,也不是其他已經存在的電商的方法,是蝦皮自己的語言。於是詹宏志把公司內部所有名詞都改成蝦皮用的。一開始你可能不知道為什麼要講這些年化營業額啊什麼的,但講著講著,你大概就會開始理解對方的邏輯是什麼,又是怎麼想的。 > > 我會後又跑去問詹宏志先生,要怎麼樣培養「看懂對手」的能力。詹宏志先生說這沒有捷徑,就是點點滴滴的累積。你要去聽他講的每一句話,推敲他的含義,去看他做的每個決策,背後代表什麼意義。而用他的語言,就是認識對手的第一步。我想這是我這場演講最大的收穫。 我在這段時間寫文章的過程中一直反覆地提到,我目前要解決的是創業從零到一的困境,而這個困境最大的挑戰是要選擇從哪個角度切入、切入後又要如何執行策略。 所以我一直都在思考,我是不是缺少了什麼? ## 你覺得棒球投手的球好打嗎? 如果你跟我一樣看過棒球,你或許也曾跟我有一樣的疑問:「那些球看起來沒有很打啊,為什麼打者都打不到?」 如果你也像我一樣天真的話,不仿看一下從打者的角度來看投手的球是怎樣的感覺? <iframe width="560" height="315" src="https://www.youtube.com/embed/KAR8YaFopA8" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> 雖然影片很晃、焦距可能沒調整好。但是你會發現球到打者的速度真的頗快,而且從18公尺外看一顆直徑只有7公分左右的球真的不是一件簡單的事。 接下來你可以換從捕手的角度來看投手的球。 <iframe width="560" height="315" src="https://www.youtube.com/embed/E2WvUMSIvew" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> 如果你看過了以上的兩個影片,你應該會大致上了解,在棒球場上的打者和捕手的視角,還有他們實際上可能會遇到的挑戰。 但是這兩部影片都是從「眼睛的角度」去觀察,那如果我們是用別人「大腦的角度」去看事情呢? ## 把自己塞到別人的思考模式當中 我發現我現在最需要做的,就是先把自己塞到一個那些已經取得成功的人的思考模式當中,跟著他們的思路去思考、去做,透過實作讓身體去熟悉他們決策的過程。 我猜大部分的人都會有「曾經試圖」學習某個技能的經驗,不論是吉他、外語、運動、或是金融等等。當我們一開始在接觸的時候,往往會不知道如何上手,然後表現得非常笨拙。 另一方面,此時的我們可能會看到有其他人對這個技能已經非常的熟悉,操作起來簡直是易如反掌。這時候的我們,常常都會在腦海裡發出讚嘆:「天阿,他也太厲害了吧,他們究竟是如何辦到的?」。 是啊,他們究竟是如何辦到的? 如果我們可以潛入他們的大腦,了解他們決策跟操作的過程,那我們是不是就可以了解他們的秘密了? ## 聽過很多大道理,卻依舊過不好這一生? 很多時候我們可能可以在書中或是很多地方,看到了很多令我們贊同的想法。但很多時候我們就只是看看、想想而已,並沒有真的對自己的人生帶來很大的改變,就像是那句「聽過很多大道理,卻依舊過不好這一生。」一樣。 會產生這樣的問題,最主要的原因是因為沒有親身體會,然後身體力行。就讓我們用「複利」這件事來當例子吧。 > 現在有兩個選擇,一個是讓你現在拿就立刻拿到一千萬;另一個選擇則是給你一塊錢,但是這一塊錢每天都會增值兩倍,而你要30天後才能拿到手。 如果是你,你會選哪一個? 如果是我,我會先進到以下這個網站,透過他們的[次方計算機](http://www.99cankao.com/numbers/exponential-power.php)來計算一下,如果一塊錢每天增值兩倍,在第30天的時候我會拿到多少錢? 答案是2的29次方(536,870,912),也就是五億三千六百多萬元。 這個數字很令人驚訝,是吧?但是如果你是實際透過次方計算機算的話,你的感受會更深刻。 ## 搜集成功者的例子,開始模仿 當我們要進入一個新的領域的時候,但是很多時候我們並沒有辦法事先參透,我們並不知道要怎麼要才能做得出色。但是我們可透過模仿,迅速了解我們究竟該怎麼做。 我們可以去搜集這些領域成功的人成功的例子,然後找出哪些事情都是他們做過的、他們又是怎麼做的,然後開始邊模仿邊實作。 當你開始實作後你可能漸漸會發現,雖然你不知道那些成功的人為什麼這麼做,但你跟他們的作法一樣的時候,你也能夠解決問題了。 而當你做得夠順的時候,你就可以去體會還有拆解他們的行為。像是他們為什麼要這樣做?這樣做的好處又是什麼? ## 從混沌大學和科技島讀開始 在混沌大學的微信公眾號和台灣的科技島讀上,常有為數不少的創業者的分享,或是商業模式的解析。他們常常會闡述他們如何從零到一開創公司、如何在困難的情況下做決策等等。往常我看文章的時候,往往就是「看完」就結束了。雖然大概知道他們是怎麼做,但也僅此於此。 接下來我可以做的訓練就是,好好去拆解那些強者們公開分享的內容。思考他們為什麼做出那些決策、如果是我我又會怎麼做。 我猜想,如果透過這種方式,我的思想就能夠漸漸跟他們一致,我也能夠從他們的決策中學到最多。而下一步,就可以跟他們一樣選擇屬於自己的主戰場,然後下場去戰鬥了。
json metadata{"tags":["cn","cn-reader","blog","startup","business"],"image":["https://i.imgur.com/mrS4ojL.jpg","https://img.youtube.com/vi/KAR8YaFopA8/0.jpg","https://img.youtube.com/vi/E2WvUMSIvew/0.jpg"],"links":["https://pixabay.com/en/mirror-woman-female-combing-hair-81780/","https://www.facebook.com/mindy.huang.7370/posts/10156712460064614","https://www.youtube.com/embed/KAR8YaFopA8","https://www.youtube.com/embed/E2WvUMSIvew","http://www.99cankao.com/numbers/exponential-power.php"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlink6ee1mk
title要突破困境,先從模仿別人的思維開始
Transaction InfoBlock #23577268/Trx 780ffdd9ed28e065580acba94c7b9328e94e5f8a
View Raw JSON Data
{
  "block": 23577268,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![](https://i.imgur.com/mrS4ojL.jpg)\n圖片取自[pixabay](https://pixabay.com/en/mirror-woman-female-combing-hair-81780/),CC License\n\n前兩天看到一篇[貼文](https://www.facebook.com/mindy.huang.7370/posts/10156712460064614),內容主要是闡述PCHome創辦人詹宏志先生,在面對蝦皮的競爭時,如何去用對手的思考模式思考,並分析對手的目的和策略,然後進一步地找出反擊的策略。\n\n\n> 最後我想特別留一段來說明我覺得今晚最重要的觀念,就是「想像你的對手怎麼思考」。詹宏志為什麼可以看出蝦皮的目的和策略?因為他很努力的把自己塞到蝦皮的角度,試著揣測蝦皮的想法。具體要怎麼做呢?最直接的方式就是「講對方的語言」。\n> \n> 每個時代的新創都有一套新的營運指標,這些指標就是「公司的語言」。例如蝦皮不講月營業額,講的是「年化營業額」,就是把一年之中營業額最高的那個月份直接乘以12。這完全不是PChome的方法,也不是其他已經存在的電商的方法,是蝦皮自己的語言。於是詹宏志把公司內部所有名詞都改成蝦皮用的。一開始你可能不知道為什麼要講這些年化營業額啊什麼的,但講著講著,你大概就會開始理解對方的邏輯是什麼,又是怎麼想的。\n> \n> 我會後又跑去問詹宏志先生,要怎麼樣培養「看懂對手」的能力。詹宏志先生說這沒有捷徑,就是點點滴滴的累積。你要去聽他講的每一句話,推敲他的含義,去看他做的每個決策,背後代表什麼意義。而用他的語言,就是認識對手的第一步。我想這是我這場演講最大的收穫。\n\n我在這段時間寫文章的過程中一直反覆地提到,我目前要解決的是創業從零到一的困境,而這個困境最大的挑戰是要選擇從哪個角度切入、切入後又要如何執行策略。\n\n所以我一直都在思考,我是不是缺少了什麼?\n\n\n## 你覺得棒球投手的球好打嗎?\n如果你跟我一樣看過棒球,你或許也曾跟我有一樣的疑問:「那些球看起來沒有很打啊,為什麼打者都打不到?」\n\n如果你也像我一樣天真的話,不仿看一下從打者的角度來看投手的球是怎樣的感覺?\n\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/KAR8YaFopA8\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>\n\n雖然影片很晃、焦距可能沒調整好。但是你會發現球到打者的速度真的頗快,而且從18公尺外看一顆直徑只有7公分左右的球真的不是一件簡單的事。\n\n\n接下來你可以換從捕手的角度來看投手的球。\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/E2WvUMSIvew\" frameborder=\"0\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>\n\n\n如果你看過了以上的兩個影片,你應該會大致上了解,在棒球場上的打者和捕手的視角,還有他們實際上可能會遇到的挑戰。\n\n但是這兩部影片都是從「眼睛的角度」去觀察,那如果我們是用別人「大腦的角度」去看事情呢?\n\n## 把自己塞到別人的思考模式當中\n\n我發現我現在最需要做的,就是先把自己塞到一個那些已經取得成功的人的思考模式當中,跟著他們的思路去思考、去做,透過實作讓身體去熟悉他們決策的過程。\n\n我猜大部分的人都會有「曾經試圖」學習某個技能的經驗,不論是吉他、外語、運動、或是金融等等。當我們一開始在接觸的時候,往往會不知道如何上手,然後表現得非常笨拙。\n\n另一方面,此時的我們可能會看到有其他人對這個技能已經非常的熟悉,操作起來簡直是易如反掌。這時候的我們,常常都會在腦海裡發出讚嘆:「天阿,他也太厲害了吧,他們究竟是如何辦到的?」。\n\n是啊,他們究竟是如何辦到的?\n\n如果我們可以潛入他們的大腦,了解他們決策跟操作的過程,那我們是不是就可以了解他們的秘密了?\n\n## 聽過很多大道理,卻依舊過不好這一生?\n很多時候我們可能可以在書中或是很多地方,看到了很多令我們贊同的想法。但很多時候我們就只是看看、想想而已,並沒有真的對自己的人生帶來很大的改變,就像是那句「聽過很多大道理,卻依舊過不好這一生。」一樣。\n\n會產生這樣的問題,最主要的原因是因為沒有親身體會,然後身體力行。就讓我們用「複利」這件事來當例子吧。\n\n> 現在有兩個選擇,一個是讓你現在拿就立刻拿到一千萬;另一個選擇則是給你一塊錢,但是這一塊錢每天都會增值兩倍,而你要30天後才能拿到手。\n\n如果是你,你會選哪一個?\n\n如果是我,我會先進到以下這個網站,透過他們的[次方計算機](http://www.99cankao.com/numbers/exponential-power.php)來計算一下,如果一塊錢每天增值兩倍,在第30天的時候我會拿到多少錢?\n\n答案是2的29次方(536,870,912),也就是五億三千六百多萬元。\n\n這個數字很令人驚訝,是吧?但是如果你是實際透過次方計算機算的話,你的感受會更深刻。\n\n## 搜集成功者的例子,開始模仿\n當我們要進入一個新的領域的時候,但是很多時候我們並沒有辦法事先參透,我們並不知道要怎麼要才能做得出色。但是我們可透過模仿,迅速了解我們究竟該怎麼做。\n\n我們可以去搜集這些領域成功的人成功的例子,然後找出哪些事情都是他們做過的、他們又是怎麼做的,然後開始邊模仿邊實作。\n\n當你開始實作後你可能漸漸會發現,雖然你不知道那些成功的人為什麼這麼做,但你跟他們的作法一樣的時候,你也能夠解決問題了。\n\n而當你做得夠順的時候,你就可以去體會還有拆解他們的行為。像是他們為什麼要這樣做?這樣做的好處又是什麼?\n\n## 從混沌大學和科技島讀開始\n在混沌大學的微信公眾號和台灣的科技島讀上,常有為數不少的創業者的分享,或是商業模式的解析。他們常常會闡述他們如何從零到一開創公司、如何在困難的情況下做決策等等。往常我看文章的時候,往往就是「看完」就結束了。雖然大概知道他們是怎麼做,但也僅此於此。\n\n接下來我可以做的訓練就是,好好去拆解那些強者們公開分享的內容。思考他們為什麼做出那些決策、如果是我我又會怎麼做。\n\n我猜想,如果透過這種方式,我的思想就能夠漸漸跟他們一致,我也能夠從他們的決策中學到最多。而下一步,就可以跟他們一樣選擇屬於自己的主戰場,然後下場去戰鬥了。",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"startup\",\"business\"],\"image\":[\"https://i.imgur.com/mrS4ojL.jpg\",\"https://img.youtube.com/vi/KAR8YaFopA8/0.jpg\",\"https://img.youtube.com/vi/E2WvUMSIvew/0.jpg\"],\"links\":[\"https://pixabay.com/en/mirror-woman-female-combing-hair-81780/\",\"https://www.facebook.com/mindy.huang.7370/posts/10156712460064614\",\"https://www.youtube.com/embed/KAR8YaFopA8\",\"https://www.youtube.com/embed/E2WvUMSIvew\",\"http://www.99cankao.com/numbers/exponential-power.php\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "6ee1mk",
      "title": "要突破困境,先從模仿別人的思維開始"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-23T15:28:39",
  "trx_id": "780ffdd9ed28e065580acba94c7b9328e94e5f8a",
  "trx_in_block": 9,
  "virtual_op": 0
}
linjiahungclaimed reward balance: 0.021 STEEM, 0.408 SBD, 0.244 SP
2018/06/23 15:23:12
accountlinjiahung
reward sbd0.408 SBD
reward steem0.021 STEEM
reward vests396.367580 VESTS
Transaction InfoBlock #23577159/Trx 72384f5a512a0b963183ca8b02c0c5a13ab86140
View Raw JSON Data
{
  "block": 23577159,
  "op": [
    "claim_reward_balance",
    {
      "account": "linjiahung",
      "reward_sbd": "0.408 SBD",
      "reward_steem": "0.021 STEEM",
      "reward_vests": "396.367580 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-23T15:23:12",
  "trx_id": "72384f5a512a0b963183ca8b02c0c5a13ab86140",
  "trx_in_block": 24,
  "virtual_op": 0
}
linjiahungreceived 0.005 STEEM, 0.089 SBD, 0.054 SP author reward for @linjiahung / rails-rails-render-1
2018/06/07 04:23:27
authorlinjiahung
permlinkrails-rails-render-1
sbd payout0.089 SBD
steem payout0.005 STEEM
vesting payout87.401490 VESTS
Transaction InfoBlock #23103858/Virtual Operation #4
View Raw JSON Data
{
  "block": 23103858,
  "op": [
    "author_reward",
    {
      "author": "linjiahung",
      "permlink": "rails-rails-render-1",
      "sbd_payout": "0.089 SBD",
      "steem_payout": "0.005 STEEM",
      "vesting_payout": "87.401490 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-07T04:23:27",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 4
}
linjiahungreceived 0.014 STEEM, 0.296 SBD, 0.175 SP author reward for @linjiahung / rails-rails-params
2018/06/06 15:46:12
authorlinjiahung
permlinkrails-rails-params
sbd payout0.296 SBD
steem payout0.014 STEEM
vesting payout284.570818 VESTS
Transaction InfoBlock #23088714/Virtual Operation #11
View Raw JSON Data
{
  "block": 23088714,
  "op": [
    "author_reward",
    {
      "author": "linjiahung",
      "permlink": "rails-rails-params",
      "sbd_payout": "0.296 SBD",
      "steem_payout": "0.014 STEEM",
      "vesting_payout": "284.570818 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-06T15:46:12",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 11
}
linjiahungreceived 0.001 STEEM, 0.007 SBD, 0.005 SP author reward for @linjiahung / rails
2018/06/04 13:18:12
authorlinjiahung
permlinkrails
sbd payout0.007 SBD
steem payout0.001 STEEM
vesting payout8.131487 VESTS
Transaction InfoBlock #23028180/Virtual Operation #3
View Raw JSON Data
{
  "block": 23028180,
  "op": [
    "author_reward",
    {
      "author": "linjiahung",
      "permlink": "rails",
      "sbd_payout": "0.007 SBD",
      "steem_payout": "0.001 STEEM",
      "vesting_payout": "8.131487 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-04T13:18:12",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 3
}
2018/06/04 10:40:09
authorbilal-haider
bodyBro if you make in english. will help alot more people. Thanks
json metadata{"tags":["cn"],"app":"steemit/0.1"}
parent authorlinjiahung
parent permlinkrails-rails-render-1
permlinkre-linjiahung-rails-rails-render-1-20180604t104007794z
title
Transaction InfoBlock #23025020/Trx d52a0fa72067b124bed357d91ffe7102a14fe9d7
View Raw JSON Data
{
  "block": 23025020,
  "op": [
    "comment",
    {
      "author": "bilal-haider",
      "body": "Bro if you make in english. will help alot more people. \nThanks",
      "json_metadata": "{\"tags\":[\"cn\"],\"app\":\"steemit/0.1\"}",
      "parent_author": "linjiahung",
      "parent_permlink": "rails-rails-render-1",
      "permlink": "re-linjiahung-rails-rails-render-1-20180604t104007794z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-04T10:40:09",
  "trx_id": "d52a0fa72067b124bed357d91ffe7102a14fe9d7",
  "trx_in_block": 20,
  "virtual_op": 0
}
2018/06/04 10:39:39
authorlinjiahung
permlinkrails-rails-render-1
voterbilal-haider
weight10000 (100.00%)
Transaction InfoBlock #23025010/Trx d1382d2abeb5439e4c9f2b8ee40e2b090967c684
View Raw JSON Data
{
  "block": 23025010,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "rails-rails-render-1",
      "voter": "bilal-haider",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-04T10:39:39",
  "trx_id": "d1382d2abeb5439e4c9f2b8ee40e2b090967c684",
  "trx_in_block": 10,
  "virtual_op": 0
}
2018/06/03 15:10:54
authorlinjiahung
body![](https://i.imgur.com/5ayx0Tb.jpg) > 商機就像是公車一樣,總會有下一班 — 理查‧布蘭登,維珍集團創辦人 「究竟要選哪個主題創業?」這是個我最近一直在思考的一件事。雖然商機這種東西就像是公車一樣,走了一班下一班還會來。但你總會想—「究竟我應該搭上哪一班公車?」 每當我在思考究竟要選擇哪個主題時,腦海中總會想起孫正義。孫正義是日本軟體銀行的創辦人,並且也以日本首富的名號為人所知。 ## 選擇賽道 他在小時候就立志要成為一個企業家,當他完成在加州柏克萊大學的學業後,他回到了日本準備開始他的企業家生涯。 在他真正開始創業之前他就認知到,創業這件事情,最重要的是選擇賽道,一個能夠讓他投入一生事業的賽道。所以他列出了以下幾個條件做為他選擇事業的原則 > * 是否能讓我在今後50年集中心力投入? > * 是不是其他人想不到的獨特事業? > * 未來10年內是否至少可以在日本名列前茅? > * 獲利高 > * 對人類有貢獻 > * 產業結構正在成長...... 他洋洋灑灑的列出了許多條件,並且找到了40種新事業。他在接下來的一年半內,針對這40項事業,編制出10年份的預估損益表、資產負債表、資金周轉表、人員計畫、行銷計畫、競爭分析、市場規模分析等。 他最終選擇了軟體流通公司,作為他人生接下來數十年的主戰場。 而我同樣也我認為,選擇一個好的賽道,對所有的創業者來說是個重要的課題。 ## 選擇賽道之前的難題 對目前的我來說,在選擇一個適合的賽道之前,我還有另外幾個大問題要先克服。那就是, 1. 沒有足夠的現金能夠支撐我創業 2. 沒有足夠的經營能力 因此我會把我接下來要經歷的過程拆分成兩個部分 1. 建立一個賺錢的公司,讓我從中鍛鍊經營和賺錢的能力 2. 選擇我要的賽道,投注未來的幾十年時間 這種在正式投入到未來幾年要從事的事業前,先找機會鍛鍊自己的經營能力的構想,其實也是來自於孫正義。 他在美國就讀大學期間,就透過從日本引進遊戲機到美國,賺了不少錢,甚至還成立了公司。他的志向不是要做一輩子的遊戲機事業,但是他知道他需要鍛鍊自己,以培養未來的經營能力。 同樣的,我有太多能力都太貧乏了,尤其是沒有足夠的現金,以及沒有足夠的經營能力。所以在有能力好好挑選賽道,並投入未來數十年的時間之前,我需要學著建立一個賺錢的公司,讓我從中鍛煉經營和賺錢的能力。 根據目前的情況,我列出了以下幾個原則(未來可能新增),作為之後第一階段建立公司的選擇依據 1. 非實體販售 2. 跟寫作無關 3. 在2年間內可執行並有機會出售 ### 非實體販售 需要從事非實體販售的生意的原因是—實體販售成本太高。 要從事實體生意,首先會面臨到的就是庫存的問題;而做實體生意往往會需要預先支出好一筆費用,來購買原料(產品)。以我目前的情況,我可能更適合走軟體和服務這塊,這樣也才能結合我目前程式開發的專長 ### 與寫作無關 之前就有提過,我有試著透過寫作賺取額外的收入。我希望可以把寫作和目前要做的生意分開的原因是 — 我希望能夠創造不同管道的收入。 而且即使透過寫作賺到很多錢,似乎也無法鍛鍊經營能力,而經營能力是我接下來主要想鍛鍊的技能。 ### 在2年間內可執行並有機會出售 如果做生意的週期太長,或是前期的前置作業要花上太久的時間,那很有可能就沒有辦法讓我在接下來的時間中有足夠實作的機會。 況且,越長的準備期,代表有可能投入更多的資本,而資本不足,也是我主要的問題之一。 ## 用五步流程實現理想 橋水資本是世界上最大的避險基金,其創辦人Ray Dalio在他的著作—「[原則:生活和工作](http://www.books.com.tw/exep/assp.php/pk60905/products/0010782941?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806)」當中,提到自己如何透過「五步流程」來實現自己的理想 1. 制定明確的目標 2. 找出妨礙以實現目標的問題,而且不要容忍這些問題存在 3. 準確地診斷問題,查明問題根源 4. 設計解決方案 5. 徹底執行 目前的我已經制定了明確目標、找出妨礙目標的問題並且查明問題的根源。現在我大概落在第四階段—「設計解決方案」。 接下來我要開始設計更明確的解決方案,並且徹底執行。畢竟,計劃做得再好,不去執行,終究也是一事無成。 之後我也會陸陸續續更新我執行的情況,希望對大家有所幫助。 ## 參考資料 [孫正義:每天5分鐘想點子,成就50年計畫](https://www.managertoday.com.tw/articles/view/50299) ## 推薦書籍 [原則:生活和工作](http://www.books.com.tw/exep/assp.php/pk60905/products/0010782941?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806) [霸氣:孫正義衝向未來的領導學](http://www.books.com.tw/exep/assp.php/pk60905/products/0010712576?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806) [孫正義都不知道的孫正義:軟銀集團創辦人的霸業足跡!童年到至今的奮鬥史!](http://www.books.com.tw/exep/assp.php/pk60905/products/0010729502?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806)
json metadata{"tags":["cn","cn-reader","blog","startup","business"],"image":["https://i.imgur.com/5ayx0Tb.jpg"],"links":["http://www.books.com.tw/exep/assp.php/pk60905/products/0010782941?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806","https://www.managertoday.com.tw/articles/view/50299","http://www.books.com.tw/exep/assp.php/pk60905/products/0010712576?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806","http://www.books.com.tw/exep/assp.php/pk60905/products/0010729502?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlink4g9bve-how-to-start-a-company
title我如何診斷目前自己的問題,並選擇創業主題 — How to start a company 系列
Transaction InfoBlock #23001637/Trx 488401076e64535c4c3faac1e0dd5e039ddc1553
View Raw JSON Data
{
  "block": 23001637,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![](https://i.imgur.com/5ayx0Tb.jpg)\n> 商機就像是公車一樣,總會有下一班 — 理查‧布蘭登,維珍集團創辦人\n\n「究竟要選哪個主題創業?」這是個我最近一直在思考的一件事。雖然商機這種東西就像是公車一樣,走了一班下一班還會來。但你總會想—「究竟我應該搭上哪一班公車?」\n\n每當我在思考究竟要選擇哪個主題時,腦海中總會想起孫正義。孫正義是日本軟體銀行的創辦人,並且也以日本首富的名號為人所知。\n## 選擇賽道\n他在小時候就立志要成為一個企業家,當他完成在加州柏克萊大學的學業後,他回到了日本準備開始他的企業家生涯。\n\n在他真正開始創業之前他就認知到,創業這件事情,最重要的是選擇賽道,一個能夠讓他投入一生事業的賽道。所以他列出了以下幾個條件做為他選擇事業的原則\n\n> * 是否能讓我在今後50年集中心力投入?\n> * 是不是其他人想不到的獨特事業?\n> * 未來10年內是否至少可以在日本名列前茅?\n> * 獲利高\n> * 對人類有貢獻\n> * 產業結構正在成長......\n\n\n他洋洋灑灑的列出了許多條件,並且找到了40種新事業。他在接下來的一年半內,針對這40項事業,編制出10年份的預估損益表、資產負債表、資金周轉表、人員計畫、行銷計畫、競爭分析、市場規模分析等。\n\n他最終選擇了軟體流通公司,作為他人生接下來數十年的主戰場。\n\n而我同樣也我認為,選擇一個好的賽道,對所有的創業者來說是個重要的課題。\n\n## 選擇賽道之前的難題\n\n對目前的我來說,在選擇一個適合的賽道之前,我還有另外幾個大問題要先克服。那就是,\n\n1. 沒有足夠的現金能夠支撐我創業\n2. 沒有足夠的經營能力\n\n因此我會把我接下來要經歷的過程拆分成兩個部分\n1. 建立一個賺錢的公司,讓我從中鍛鍊經營和賺錢的能力\n2. 選擇我要的賽道,投注未來的幾十年時間\n\n\n這種在正式投入到未來幾年要從事的事業前,先找機會鍛鍊自己的經營能力的構想,其實也是來自於孫正義。\n\n他在美國就讀大學期間,就透過從日本引進遊戲機到美國,賺了不少錢,甚至還成立了公司。他的志向不是要做一輩子的遊戲機事業,但是他知道他需要鍛鍊自己,以培養未來的經營能力。\n\n同樣的,我有太多能力都太貧乏了,尤其是沒有足夠的現金,以及沒有足夠的經營能力。所以在有能力好好挑選賽道,並投入未來數十年的時間之前,我需要學著建立一個賺錢的公司,讓我從中鍛煉經營和賺錢的能力。\n\n根據目前的情況,我列出了以下幾個原則(未來可能新增),作為之後第一階段建立公司的選擇依據\n\n1. 非實體販售\n2. 跟寫作無關\n3. 在2年間內可執行並有機會出售\n\n### 非實體販售\n需要從事非實體販售的生意的原因是—實體販售成本太高。\n\n要從事實體生意,首先會面臨到的就是庫存的問題;而做實體生意往往會需要預先支出好一筆費用,來購買原料(產品)。以我目前的情況,我可能更適合走軟體和服務這塊,這樣也才能結合我目前程式開發的專長\n### 與寫作無關\n之前就有提過,我有試著透過寫作賺取額外的收入。我希望可以把寫作和目前要做的生意分開的原因是 — 我希望能夠創造不同管道的收入。\n\n而且即使透過寫作賺到很多錢,似乎也無法鍛鍊經營能力,而經營能力是我接下來主要想鍛鍊的技能。\n### 在2年間內可執行並有機會出售\n如果做生意的週期太長,或是前期的前置作業要花上太久的時間,那很有可能就沒有辦法讓我在接下來的時間中有足夠實作的機會。\n\n況且,越長的準備期,代表有可能投入更多的資本,而資本不足,也是我主要的問題之一。\n\n## 用五步流程實現理想\n\n橋水資本是世界上最大的避險基金,其創辦人Ray Dalio在他的著作—「[原則:生活和工作](http://www.books.com.tw/exep/assp.php/pk60905/products/0010782941?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806)」當中,提到自己如何透過「五步流程」來實現自己的理想\n1. 制定明確的目標\n2. 找出妨礙以實現目標的問題,而且不要容忍這些問題存在\n3. 準確地診斷問題,查明問題根源\n4. 設計解決方案\n5. 徹底執行\n\n目前的我已經制定了明確目標、找出妨礙目標的問題並且查明問題的根源。現在我大概落在第四階段—「設計解決方案」。\n\n接下來我要開始設計更明確的解決方案,並且徹底執行。畢竟,計劃做得再好,不去執行,終究也是一事無成。\n\n之後我也會陸陸續續更新我執行的情況,希望對大家有所幫助。\n\n## 參考資料\n[孫正義:每天5分鐘想點子,成就50年計畫](https://www.managertoday.com.tw/articles/view/50299)\n\n## 推薦書籍\n[原則:生活和工作](http://www.books.com.tw/exep/assp.php/pk60905/products/0010782941?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806)\n[霸氣:孫正義衝向未來的領導學](http://www.books.com.tw/exep/assp.php/pk60905/products/0010712576?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806)\n[孫正義都不知道的孫正義:軟銀集團創辦人的霸業足跡!童年到至今的奮鬥史!](http://www.books.com.tw/exep/assp.php/pk60905/products/0010729502?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806)",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"startup\",\"business\"],\"image\":[\"https://i.imgur.com/5ayx0Tb.jpg\"],\"links\":[\"http://www.books.com.tw/exep/assp.php/pk60905/products/0010782941?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806\",\"https://www.managertoday.com.tw/articles/view/50299\",\"http://www.books.com.tw/exep/assp.php/pk60905/products/0010712576?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806\",\"http://www.books.com.tw/exep/assp.php/pk60905/products/0010729502?utm_source=pk60905&utm_medium=ap-books&utm_content=recommend&utm_campaign=ap-201806\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "4g9bve-how-to-start-a-company",
      "title": "我如何診斷目前自己的問題,並選擇創業主題 — How to start a company 系列"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-03T15:10:54",
  "trx_id": "488401076e64535c4c3faac1e0dd5e039ddc1553",
  "trx_in_block": 22,
  "virtual_op": 0
}
linjiahungreceived 0.001 STEEM, 0.016 SBD, 0.010 SP author reward for @linjiahung / 4nwrgw-how-to-start-a-company
2018/06/03 14:25:24
authorlinjiahung
permlink4nwrgw-how-to-start-a-company
sbd payout0.016 SBD
steem payout0.001 STEEM
vesting payout16.263785 VESTS
Transaction InfoBlock #23000726/Virtual Operation #3
View Raw JSON Data
{
  "block": 23000726,
  "op": [
    "author_reward",
    {
      "author": "linjiahung",
      "permlink": "4nwrgw-how-to-start-a-company",
      "sbd_payout": "0.016 SBD",
      "steem_payout": "0.001 STEEM",
      "vesting_payout": "16.263785 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-03T14:25:24",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 3
}
linjiahungpublished a new post: formbuilder
2018/06/03 02:48:15
authorlinjiahung
body![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png) ## 什麼是FormBuilder > 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。 這個翻譯有點拗口,讓我們看看實際的例子。 當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。 ```ruby= <%= form_tag("/pages") do %> <%= label_tag(:user, "User") %> <%= text_field(:pages, :user) %> <%= submit_tag("submit") %> <% end %> ``` ![](https://i.imgur.com/n0Nrjkb.png) text_field這個helper的第一個參數代表的是我們想要編輯的object,第二個參數則是對應的屬性。這樣的寫法有個潛在的壞處是,如果我們有好幾個欄位要處理,那就要不斷的傳入要編輯的物件名稱。 所以當我們的表單是要處理一個Model的物件時,我們通常會使用`form_for`這個helper來處理。以下是程式碼的範例 ```ruby= <%= form_for @page do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit %> <% end %> ``` 這邊的`f`是一個表單構造器(Form Builder)物件(f 變數)。當你傳入一個物件給form_for後(這裡是@page),當我們在block內部使用如`<%= f.text_field :user %>`的程式碼時,就會得到如`<%= text_field(:pages, :user) %>`的效果。 > 註:如果在表單中想要得到關聯的object,可以透過f.object得到。 ## 客製化FormBuilder 上面簡單介紹了form_builder的常見用法,但事實上FormBuilder的用處不止於此 假設我們希望客製化我的label,當欄位資料無法通過model驗證時,讓label顯示錯誤訊息並改變顏色。這樣的效果我們可以透過form_builder幫我們客製化,而不用在view裡面使用大量的邏輯。 我們這邊需要驗證的是user這個欄位不能是空白。 ```ruby= class Page < ApplicationRecord validates :user, presence: true end ``` 首先在app/helpers下建立一個`my_form_builder.rb`檔,並繼承自`ActionView::Helpers::FormBuilder` class。 接著override原先的label方法,加入客製化的text訊息。(label的原始碼可以[參考](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label)) ```ruby= class MyFormBuilder < ActionView::Helpers::FormBuilder def label(method, text = nil, optinos = {}, &block) errors = object.errors[method.to_sym] if errors text += " <span class=\"error\" style=\"color:red\">#{errors.first}</span>" end super(method, text.html_safe, options, &block) end end ``` 然後我們要在`form_for`中引入這個客製化的form builder。這邊我們需要使用`builder:`來引入`MyFormBuilder` ```ruby= <%= form_for @page, builder: MyFormBuilder do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit "送出" %> <% end %> ``` 這樣當我們user欄位是空白時,我們就可以得到以下的畫面。 ![](https://i.imgur.com/K1Bem3t.png) 這樣的話我們就能夠既使用我們客製化的又不影響本來form_for的效果。 ## 客製化form_for 更進一步,你還可以客製化你的form_for方法, 到到`app/helers/application_helper.rb`中,新增一個`my_form_for`的方法。在內部引用`form_for`,並在options中merge builder。([form_for原始碼](https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430)) ```ruby= module ApplicationHelper def my_form_for(record, options = {}, &proc) form_for(record, options.merge!({builder: MyFormBuilder}), &proc) end end ``` 接著將view中的`form_for`改寫成`my_form_for` ```ruby= <%= my_form_for @page do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit "送出" %> <% end %> ``` 可以達成一樣的效果。 ![](https://i.imgur.com/K1Bem3t.png) ## 參考資料 [Action View Form Helpers](http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders) [ActionView::Helpers::FormBuilder](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html)
json metadata{"tags":["cn","cn-reader","blog","ruby","rails"],"users":["page"],"image":["https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png","https://i.imgur.com/n0Nrjkb.png","https://i.imgur.com/K1Bem3t.png"],"links":["http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label","https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430","http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders","http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlinkformbuilder
title[Rails]使用FormBuilder自定義你的表單
Transaction InfoBlock #22986784/Trx 355d47b82a96f106f8ffb5851bb670deadcca041
View Raw JSON Data
{
  "block": 22986784,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png)\n## 什麼是FormBuilder\n> 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。\n\n這個翻譯有點拗口,讓我們看看實際的例子。\n\n當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。\n```ruby=\n<%= form_tag(\"/pages\") do %>\n  <%= label_tag(:user, \"User\") %>\n  <%= text_field(:pages, :user) %>\n  <%= submit_tag(\"submit\") %>\n<% end %>\n```\n![](https://i.imgur.com/n0Nrjkb.png)\n\ntext_field這個helper的第一個參數代表的是我們想要編輯的object,第二個參數則是對應的屬性。這樣的寫法有個潛在的壞處是,如果我們有好幾個欄位要處理,那就要不斷的傳入要編輯的物件名稱。\n\n\n所以當我們的表單是要處理一個Model的物件時,我們通常會使用`form_for`這個helper來處理。以下是程式碼的範例\n```ruby=\n<%= form_for @page do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit %>\n<% end %>\n```\n這邊的`f`是一個表單構造器(Form Builder)物件(f 變數)。當你傳入一個物件給form_for後(這裡是@page),當我們在block內部使用如`<%= f.text_field :user %>`的程式碼時,就會得到如`<%= text_field(:pages, :user) %>`的效果。\n\n> 註:如果在表單中想要得到關聯的object,可以透過f.object得到。\n\n## 客製化FormBuilder\n上面簡單介紹了form_builder的常見用法,但事實上FormBuilder的用處不止於此\n\n假設我們希望客製化我的label,當欄位資料無法通過model驗證時,讓label顯示錯誤訊息並改變顏色。這樣的效果我們可以透過form_builder幫我們客製化,而不用在view裡面使用大量的邏輯。\n\n我們這邊需要驗證的是user這個欄位不能是空白。\n```ruby=\nclass Page < ApplicationRecord\n  validates :user, presence: true\nend\n```\n\n首先在app/helpers下建立一個`my_form_builder.rb`檔,並繼承自`ActionView::Helpers::FormBuilder` class。\n\n接著override原先的label方法,加入客製化的text訊息。(label的原始碼可以[參考](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label))\n\n```ruby=\nclass MyFormBuilder < ActionView::Helpers::FormBuilder\n  def label(method, text = nil, optinos = {}, &block)\n    errors = object.errors[method.to_sym]\n    if errors \n      text += \" <span class=\\\"error\\\" style=\\\"color:red\\\">#{errors.first}</span>\"\n    end\n    super(method, text.html_safe, options, &block)\n  end\nend\n```\n\n然後我們要在`form_for`中引入這個客製化的form builder。這邊我們需要使用`builder:`來引入`MyFormBuilder`\n```ruby=\n<%= form_for @page, builder: MyFormBuilder do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit \"送出\" %>\n<% end %>\n```\n\n這樣當我們user欄位是空白時,我們就可以得到以下的畫面。\n![](https://i.imgur.com/K1Bem3t.png)\n\n這樣的話我們就能夠既使用我們客製化的又不影響本來form_for的效果。\n\n## 客製化form_for\n更進一步,你還可以客製化你的form_for方法,\n\n到到`app/helers/application_helper.rb`中,新增一個`my_form_for`的方法。在內部引用`form_for`,並在options中merge builder。([form_for原始碼](https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430))\n\n```ruby=\nmodule ApplicationHelper\n  def my_form_for(record, options = {}, &proc)\n    form_for(record, options.merge!({builder: MyFormBuilder}), &proc)\n  end\nend\n```\n\n接著將view中的`form_for`改寫成`my_form_for`\n```ruby=\n<%= my_form_for @page do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit \"送出\" %>\n<% end %>\n```\n\n可以達成一樣的效果。\n![](https://i.imgur.com/K1Bem3t.png)\n\n## 參考資料\n[Action View Form Helpers](http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders)\n[ActionView::Helpers::FormBuilder](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html)",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"ruby\",\"rails\"],\"users\":[\"page\"],\"image\":[\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png\",\"https://i.imgur.com/n0Nrjkb.png\",\"https://i.imgur.com/K1Bem3t.png\"],\"links\":[\"http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label\",\"https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430\",\"http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders\",\"http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "formbuilder",
      "title": "[Rails]使用FormBuilder自定義你的表單"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-03T02:48:15",
  "trx_id": "355d47b82a96f106f8ffb5851bb670deadcca041",
  "trx_in_block": 8,
  "virtual_op": 0
}
2018/06/03 02:47:45
idfollow
json["follow",{"follower":"linjiahung","following":"a-0-0","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22986774/Trx af6d84cf1d10f4e4442b7f8453ecb1822c57d85e
View Raw JSON Data
{
  "block": 22986774,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"a-0-0\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-03T02:47:45",
  "trx_id": "af6d84cf1d10f4e4442b7f8453ecb1822c57d85e",
  "trx_in_block": 23,
  "virtual_op": 0
}
2018/06/02 14:12:06
authorcn-cutie.pie
body@linjiahung, 棒棒哒~~~ ![img](https://i.imgur.com/ykWVNYX.png)
json metadata{"tags":["cn"]}
parent authorlinjiahung
parent permlinkformbuilder
permlink20180602t141206687z-post
title
Transaction InfoBlock #22971671/Trx 254a82b60f8dc2b17586551f8a99c31513adb9c9
View Raw JSON Data
{
  "block": 22971671,
  "op": [
    "comment",
    {
      "author": "cn-cutie.pie",
      "body": "@linjiahung, 棒棒哒~~~ ![img](https://i.imgur.com/ykWVNYX.png)",
      "json_metadata": "{\"tags\":[\"cn\"]}",
      "parent_author": "linjiahung",
      "parent_permlink": "formbuilder",
      "permlink": "20180602t141206687z-post",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-02T14:12:06",
  "trx_id": "254a82b60f8dc2b17586551f8a99c31513adb9c9",
  "trx_in_block": 60,
  "virtual_op": 0
}
2018/06/02 14:12:03
authorlinjiahung
permlinkformbuilder
votercn-cutie.pie
weight2764 (27.64%)
Transaction InfoBlock #22971670/Trx e66d0f175eba0e10be24fb64471aef007ffeca20
View Raw JSON Data
{
  "block": 22971670,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "formbuilder",
      "voter": "cn-cutie.pie",
      "weight": 2764
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-02T14:12:03",
  "trx_id": "e66d0f175eba0e10be24fb64471aef007ffeca20",
  "trx_in_block": 20,
  "virtual_op": 0
}
linjiahungpublished a new post: formbuilder
2018/06/02 13:59:45
authorlinjiahung
body![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png) ## 什麼是FormBuilder > 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。 這個翻譯有點拗口,讓我們看看實際的例子。 當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。 ```ruby= <%= form_tag("/pages") do %> <%= label_tag(:user, "User") %> <%= text_field(:pages, :user) %> <%= submit_tag("submit") %> <% end %> ``` ![](https://i.imgur.com/n0Nrjkb.png) text_field這個helper的第一個參數代表的是我們想要編輯的object,第二個參數則是對應的屬性。這樣的寫法有個潛在的壞處是,如果我們有好幾個欄位要處理,那就要不斷的傳入要編輯的物件名稱。 所以當我們的表單是要處理一個Model的物件時,我們通常會使用`form_for`這個helper來處理。以下是程式碼的範例 ```ruby= <%= form_for @page do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit %> <% end %> ``` 這邊的`f`是一個表單構造器(Form Builder)物件(f 變數)。當你傳入一個物件給form_for後(這裡是@page),當我們在block內部使用如`<%= f.text_field :user %>`的程式碼時,就會得到如`<%= text_field(:pages, :user) %>`的效果。 > 註:如果在表單中想要得到關聯的object,可以透過f.object得到。 ## 客製化FormBuilder 上面簡單介紹了form_builder的常見用法,但事實上FormBuilder的用處不止於此 假設我們希望客製化我的label,當欄位資料無法通過model驗證時,讓label顯示錯誤訊息並改變顏色。這樣的效果我們可以透過form_builder幫我們客製化,而不用在view裡面使用大量的邏輯。 我們這邊需要驗證的是user這個欄位不能是空白。 ```ruby= class Page < ApplicationRecord validates :user, presence: true end ``` 首先在app/helpers下建立一個`my_form_builder.rb`檔,並繼承自`ActionView::Helpers::FormBuilder` class。 接著override原先的label方法,加入客製化的text訊息。(label的原始碼可以[參考](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label)) ```ruby= class MyFormBuilder < ActionView::Helpers::FormBuilder def label(method, text = nil, optinos = {}, &block) errors = object.errors[method.to_sym] if errors text += " <span class=\"error\" style=\"color:red\">#{errors.first}</span>" end super(method, text.html_safe, options, &block) end end ``` 然後我們要在`form_for`中引入這個客製化的form builder。這邊我們需要使用`builder:`來引入`MyFormBuilder` ```ruby= <%= form_for @page, builder: MyFormBuilder do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit "送出" %> <% end %> ``` 這樣當我們user欄位是空白時,我們就可以得到以下的畫面。 ![](https://i.imgur.com/K1Bem3t.png) 這樣的話我們就能夠既使用我們客製化的又不影響本來form_for的效果。 ## 客製化form_for 更進一步,你還可以客製化你的form_for方法, 到到`app/helers/application_helper.rb`中,新增一個`my_form_for`的方法。在內部引用`form_for`,並在options中merge builder。([form_for原始碼](https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430)) ```ruby= module ApplicationHelper def my_form_for(record, options = {}, &proc) form_for(record, options.merge!({builder: MyFormBuilder}), &proc) end end ``` 接著將view中的`form_for`改寫成`my_form_for` ```ruby= <%= my_form_for @page do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit "送出" %> <% end %> ``` 可以達成一樣的效果。 ![](https://i.imgur.com/K1Bem3t.png) ## 參考資料 [Action View Form Helpers](http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders) [ActionView::Helpers::FormBuilder](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html)
json metadata{"tags":["cn","cn-reader","blog","ruby","rails"],"users":["page"],"image":["https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png","https://i.imgur.com/n0Nrjkb.png","https://i.imgur.com/K1Bem3t.png"],"links":["http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label","https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430","http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders","http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlinkformbuilder
title使用FormBuilder自定義你的表單
Transaction InfoBlock #22971424/Trx 1601a4c19e8afef5c61c53bf1284ca307dc4ee53
View Raw JSON Data
{
  "block": 22971424,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png)\n## 什麼是FormBuilder\n> 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。\n\n這個翻譯有點拗口,讓我們看看實際的例子。\n\n當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。\n```ruby=\n<%= form_tag(\"/pages\") do %>\n  <%= label_tag(:user, \"User\") %>\n  <%= text_field(:pages, :user) %>\n  <%= submit_tag(\"submit\") %>\n<% end %>\n```\n![](https://i.imgur.com/n0Nrjkb.png)\n\ntext_field這個helper的第一個參數代表的是我們想要編輯的object,第二個參數則是對應的屬性。這樣的寫法有個潛在的壞處是,如果我們有好幾個欄位要處理,那就要不斷的傳入要編輯的物件名稱。\n\n\n所以當我們的表單是要處理一個Model的物件時,我們通常會使用`form_for`這個helper來處理。以下是程式碼的範例\n```ruby=\n<%= form_for @page do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit %>\n<% end %>\n```\n這邊的`f`是一個表單構造器(Form Builder)物件(f 變數)。當你傳入一個物件給form_for後(這裡是@page),當我們在block內部使用如`<%= f.text_field :user %>`的程式碼時,就會得到如`<%= text_field(:pages, :user) %>`的效果。\n\n> 註:如果在表單中想要得到關聯的object,可以透過f.object得到。\n\n## 客製化FormBuilder\n上面簡單介紹了form_builder的常見用法,但事實上FormBuilder的用處不止於此\n\n假設我們希望客製化我的label,當欄位資料無法通過model驗證時,讓label顯示錯誤訊息並改變顏色。這樣的效果我們可以透過form_builder幫我們客製化,而不用在view裡面使用大量的邏輯。\n\n我們這邊需要驗證的是user這個欄位不能是空白。\n```ruby=\nclass Page < ApplicationRecord\n  validates :user, presence: true\nend\n```\n\n首先在app/helpers下建立一個`my_form_builder.rb`檔,並繼承自`ActionView::Helpers::FormBuilder` class。\n\n接著override原先的label方法,加入客製化的text訊息。(label的原始碼可以[參考](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label))\n\n```ruby=\nclass MyFormBuilder < ActionView::Helpers::FormBuilder\n  def label(method, text = nil, optinos = {}, &block)\n    errors = object.errors[method.to_sym]\n    if errors \n      text += \" <span class=\\\"error\\\" style=\\\"color:red\\\">#{errors.first}</span>\"\n    end\n    super(method, text.html_safe, options, &block)\n  end\nend\n```\n\n然後我們要在`form_for`中引入這個客製化的form builder。這邊我們需要使用`builder:`來引入`MyFormBuilder`\n```ruby=\n<%= form_for @page, builder: MyFormBuilder do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit \"送出\" %>\n<% end %>\n```\n\n這樣當我們user欄位是空白時,我們就可以得到以下的畫面。\n![](https://i.imgur.com/K1Bem3t.png)\n\n這樣的話我們就能夠既使用我們客製化的又不影響本來form_for的效果。\n\n## 客製化form_for\n更進一步,你還可以客製化你的form_for方法,\n\n到到`app/helers/application_helper.rb`中,新增一個`my_form_for`的方法。在內部引用`form_for`,並在options中merge builder。([form_for原始碼](https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430))\n\n```ruby=\nmodule ApplicationHelper\n  def my_form_for(record, options = {}, &proc)\n    form_for(record, options.merge!({builder: MyFormBuilder}), &proc)\n  end\nend\n```\n\n接著將view中的`form_for`改寫成`my_form_for`\n```ruby=\n<%= my_form_for @page do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit \"送出\" %>\n<% end %>\n```\n\n可以達成一樣的效果。\n![](https://i.imgur.com/K1Bem3t.png)\n\n## 參考資料\n[Action View Form Helpers](http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders)\n[ActionView::Helpers::FormBuilder](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html)",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"ruby\",\"rails\"],\"users\":[\"page\"],\"image\":[\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png\",\"https://i.imgur.com/n0Nrjkb.png\",\"https://i.imgur.com/K1Bem3t.png\"],\"links\":[\"http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label\",\"https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430\",\"http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders\",\"http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "formbuilder",
      "title": "使用FormBuilder自定義你的表單"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-02T13:59:45",
  "trx_id": "1601a4c19e8afef5c61c53bf1284ca307dc4ee53",
  "trx_in_block": 13,
  "virtual_op": 0
}
linjiahungpublished a new post: formbuilder
2018/06/02 13:59:24
authorlinjiahung
body![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png) ## 什麼是FormBuilder > 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。 這個翻譯有點拗口,讓我們看看實際的例子。 當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。 ```ruby= <%= form_tag("/pages") do %> <%= label_tag(:user, "User") %> <%= text_field(:pages, :user) %> <%= submit_tag("submit") %> <% end %> ``` ![](https://i.imgur.com/n0Nrjkb.png) text_field這個helper的第一個參數代表的是我們想要編輯的object,第二個參數則是對應的屬性。這樣的寫法有個潛在的壞處是,如果我們有好幾個欄位要處理,那就要不斷的傳入要編輯的物件名稱。 所以當我們的表單是要處理一個Model的物件時,我們通常會使用`form_for`這個helper來處理。以下是程式碼的範例 ```ruby= <%= form_for @page do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit %> <% end %> ``` 這邊的`f`是一個表單構造器(Form Builder)物件(f 變數)。當你傳入一個物件給form_for後(這裡是@page),當我們在block內部使用如`<%= f.text_field :user %>`的程式碼時,就會得到如`<%= text_field(:pages, :user) %>`的效果。 > 註:如果在表單中想要得到關聯的object,可以透過f.object得到。 ## 客製化FormBuilder 上面簡單介紹了form_builder的常見用法,但事實上FormBuilder的用處不止於此 假設我們希望客製化我的label,當欄位資料無法通過model驗證時,讓label顯示錯誤訊息並改變顏色。這樣的效果我們可以透過form_builder幫我們客製化,而不用在view裡面使用大量的邏輯。 我們這邊需要驗證的是user這個欄位不能是空白。 ```ruby= class Page < ApplicationRecord validates :user, presence: true end ``` 首先在app/helpers下建立一個`my_form_builder.rb`檔,並繼承自`ActionView::Helpers::FormBuilder` class。 接著override原先的label方法,加入客製化的text訊息。(label的原始碼可以[參考](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label)) ```ruby= class MyFormBuilder < ActionView::Helpers::FormBuilder def label(method, text = nil, optinos = {}, &block) errors = object.errors[method.to_sym] if errors text += " <span class=\"error\" style=\"color:red\">#{errors.first}</span>" end super(method, text.html_safe, options, &block) end end ``` 然後我們要在`form_for`中引入這個客製化的form builder。這邊我們需要使用`builder:`來引入`MyFormBuilder` ```ruby= <%= form_for @page, builder: MyFormBuilder do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit "送出" %> <% end %> ``` 這樣當我們user欄位是空白時,我們就可以得到以下的畫面。 ![](https://i.imgur.com/K1Bem3t.png) 這樣的話我們就能夠既使用我們客製化的又不影響本來form_for的效果。 ## 客製化form_for 更進一步,你還可以客製化你的form_for方法, 到到`app/helers/application_helper.rb`中,新增一個`my_form_for`的方法。在內部引用`form_for`,並在options中merge builder。([form_for原始碼](https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430)) ```ruby= module ApplicationHelper def my_form_for(record, options = {}, &proc) form_for(record, options.merge!({builder: MyFormBuilder}), &proc) end end ``` 接著將view中的`form_for`改寫成`my_form_for` ```ruby= <%= my_form_for @page do |f| %> <%= f.label :user, "User" %> <%= f.text_field :user %> <%= f.submit "送出" %> <% end %> ``` 可以達成一樣的效果。 ![](https://i.imgur.com/K1Bem3t.png) ## 參考資料 [Action View Form Helpers](http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders) [ActionView::Helpers::FormBuilder](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html)
json metadata{"tags":["cn","cn-reader","blog","ruby","rails"],"users":["page"],"image":["https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png","https://i.imgur.com/n0Nrjkb.png","https://i.imgur.com/K1Bem3t.png"],"links":["http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label","https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430","http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders","http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlinkformbuilder
title# 使用FormBuilder自定義你的表單
Transaction InfoBlock #22971417/Trx 23c989e650e90825f3cd2f7a950f49cf2ad17359
View Raw JSON Data
{
  "block": 22971417,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png)\n## 什麼是FormBuilder\n> 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。\n\n這個翻譯有點拗口,讓我們看看實際的例子。\n\n當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。\n```ruby=\n<%= form_tag(\"/pages\") do %>\n  <%= label_tag(:user, \"User\") %>\n  <%= text_field(:pages, :user) %>\n  <%= submit_tag(\"submit\") %>\n<% end %>\n```\n![](https://i.imgur.com/n0Nrjkb.png)\n\ntext_field這個helper的第一個參數代表的是我們想要編輯的object,第二個參數則是對應的屬性。這樣的寫法有個潛在的壞處是,如果我們有好幾個欄位要處理,那就要不斷的傳入要編輯的物件名稱。\n\n\n所以當我們的表單是要處理一個Model的物件時,我們通常會使用`form_for`這個helper來處理。以下是程式碼的範例\n```ruby=\n<%= form_for @page do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit %>\n<% end %>\n```\n這邊的`f`是一個表單構造器(Form Builder)物件(f 變數)。當你傳入一個物件給form_for後(這裡是@page),當我們在block內部使用如`<%= f.text_field :user %>`的程式碼時,就會得到如`<%= text_field(:pages, :user) %>`的效果。\n\n> 註:如果在表單中想要得到關聯的object,可以透過f.object得到。\n\n## 客製化FormBuilder\n上面簡單介紹了form_builder的常見用法,但事實上FormBuilder的用處不止於此\n\n假設我們希望客製化我的label,當欄位資料無法通過model驗證時,讓label顯示錯誤訊息並改變顏色。這樣的效果我們可以透過form_builder幫我們客製化,而不用在view裡面使用大量的邏輯。\n\n我們這邊需要驗證的是user這個欄位不能是空白。\n```ruby=\nclass Page < ApplicationRecord\n  validates :user, presence: true\nend\n```\n\n首先在app/helpers下建立一個`my_form_builder.rb`檔,並繼承自`ActionView::Helpers::FormBuilder` class。\n\n接著override原先的label方法,加入客製化的text訊息。(label的原始碼可以[參考](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label))\n\n```ruby=\nclass MyFormBuilder < ActionView::Helpers::FormBuilder\n  def label(method, text = nil, optinos = {}, &block)\n    errors = object.errors[method.to_sym]\n    if errors \n      text += \" <span class=\\\"error\\\" style=\\\"color:red\\\">#{errors.first}</span>\"\n    end\n    super(method, text.html_safe, options, &block)\n  end\nend\n```\n\n然後我們要在`form_for`中引入這個客製化的form builder。這邊我們需要使用`builder:`來引入`MyFormBuilder`\n```ruby=\n<%= form_for @page, builder: MyFormBuilder do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit \"送出\" %>\n<% end %>\n```\n\n這樣當我們user欄位是空白時,我們就可以得到以下的畫面。\n![](https://i.imgur.com/K1Bem3t.png)\n\n這樣的話我們就能夠既使用我們客製化的又不影響本來form_for的效果。\n\n## 客製化form_for\n更進一步,你還可以客製化你的form_for方法,\n\n到到`app/helers/application_helper.rb`中,新增一個`my_form_for`的方法。在內部引用`form_for`,並在options中merge builder。([form_for原始碼](https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430))\n\n```ruby=\nmodule ApplicationHelper\n  def my_form_for(record, options = {}, &proc)\n    form_for(record, options.merge!({builder: MyFormBuilder}), &proc)\n  end\nend\n```\n\n接著將view中的`form_for`改寫成`my_form_for`\n```ruby=\n<%= my_form_for @page do |f| %>\n  <%= f.label :user, \"User\" %>\n  <%= f.text_field :user %>\n  <%= f.submit \"送出\" %>\n<% end %>\n```\n\n可以達成一樣的效果。\n![](https://i.imgur.com/K1Bem3t.png)\n\n## 參考資料\n[Action View Form Helpers](http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders)\n[ActionView::Helpers::FormBuilder](http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html)",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"ruby\",\"rails\"],\"users\":[\"page\"],\"image\":[\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png\",\"https://i.imgur.com/n0Nrjkb.png\",\"https://i.imgur.com/K1Bem3t.png\"],\"links\":[\"http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html#method-i-label\",\"https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/actionview/lib/action_view/helpers/form_helper.rb#L430\",\"http://guides.rubyonrails.org/form_helpers.html#customizing-form-builders\",\"http://api.rubyonrails.org/v5.2.0/classes/ActionView/Helpers/FormBuilder.html\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "formbuilder",
      "title": "# 使用FormBuilder自定義你的表單"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-02T13:59:24",
  "trx_id": "23c989e650e90825f3cd2f7a950f49cf2ad17359",
  "trx_in_block": 40,
  "virtual_op": 0
}
linjiahungpublished a new post: rails-rails-params
2018/06/01 13:47:48
authorlinjiahung
body@@ -2524,487 +2524,8 @@ %E5%9B%A0%E3%80%82%0A%0A -## Routing Parameters%0A%60%60%60ruby=%0Aget '/clients/:status' =%3E 'clients#index', foo: 'bar'%0A%60%60%60%0A%0A%0A%0Aedit_page_path(@page)%0A%0ARails%E6%9C%83%E8%AA%BF%E7%94%A8%60to_params%60%E9%80%99%E5%80%8B%E6%96%B9%E6%B3%95%EF%BC%8C%E5%B0%87object%E8%BD%89%E6%88%90id%0A%60%60%60ruby=%0Adef to_param%0A # We can't use alias_method here, because method 'id' optimizes itself on the fly.%0A id && id.to_s # Be sure to stringify the id for routes%0Aend%0A%60%60%60%0A%0A%0A%0A%E9%80%99%E5%80%8B%E6%83%85%E6%B3%81%E8%A3%A1%EF%BC%8C%E7%95%B6%E4%BD%BF%E7%94%A8%E8%80%85%E6%89%93%E9%96%8B /clients/active %E9%80%99%E4%B8%80%E9%A0%81%EF%BC%8Cparams%5B:status%5D %E4%BE%BF%E6%9C%83%E8%A2%AB%E8%A8%AD%E6%88%90 %22active%22%EF%BC%8Cparams%5B:foo%5D %E4%B9%9F%E6%9C%83%E8%A2%AB%E8%A8%AD%E6%88%90 %22bar%22%EF%BC%8C%E5%B0%B1%E5%83%8F%E6%98%AF%E6%88%91%E5%80%91%E5%8E%9F%E6%9C%AC%E9%80%8F%E9%81%8E Query String %E5%82%B3%E9%80%B2%E5%8E%BB%E9%82%A3%E6%A8%A3%E3%80%82%E5%90%8C%E6%A8%A3%E7%9A%84%EF%BC%8Cparams%5B:action%5D %E4%B9%9F%E6%9C%83%E8%A2%AB%E8%A8%AD%E6%88%90 index%E3%80%82%0A%0A%0A ## H
json metadata{"tags":["cn","cn-reader","blog","ruby","rails"],"users":["page"],"image":["https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png","https://i.imgur.com/mQE0kSh.png","https://i.imgur.com/3QTOsFH.png"],"links":["http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html","https://rails.ruby.tw/action_controller_overview.html","https://ihower.tw/rails/routing.html","https://gist.github.com/cdmwebs/1209732"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlinkrails-rails-params
title[Rails]如何使用Rails中的params
Transaction InfoBlock #22942403/Trx 8e34259b6e31225c58406de303e08a45a549ceba
View Raw JSON Data
{
  "block": 22942403,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "@@ -2524,487 +2524,8 @@\n %E5%9B%A0%E3%80%82%0A%0A\n-## Routing Parameters%0A%60%60%60ruby=%0Aget '/clients/:status' =%3E 'clients#index', foo: 'bar'%0A%60%60%60%0A%0A%0A%0Aedit_page_path(@page)%0A%0ARails%E6%9C%83%E8%AA%BF%E7%94%A8%60to_params%60%E9%80%99%E5%80%8B%E6%96%B9%E6%B3%95%EF%BC%8C%E5%B0%87object%E8%BD%89%E6%88%90id%0A%60%60%60ruby=%0Adef to_param%0A  # We can't use alias_method here, because method 'id' optimizes itself on the fly.%0A  id && id.to_s # Be sure to stringify the id for routes%0Aend%0A%60%60%60%0A%0A%0A%0A%E9%80%99%E5%80%8B%E6%83%85%E6%B3%81%E8%A3%A1%EF%BC%8C%E7%95%B6%E4%BD%BF%E7%94%A8%E8%80%85%E6%89%93%E9%96%8B /clients/active %E9%80%99%E4%B8%80%E9%A0%81%EF%BC%8Cparams%5B:status%5D %E4%BE%BF%E6%9C%83%E8%A2%AB%E8%A8%AD%E6%88%90 %22active%22%EF%BC%8Cparams%5B:foo%5D %E4%B9%9F%E6%9C%83%E8%A2%AB%E8%A8%AD%E6%88%90 %22bar%22%EF%BC%8C%E5%B0%B1%E5%83%8F%E6%98%AF%E6%88%91%E5%80%91%E5%8E%9F%E6%9C%AC%E9%80%8F%E9%81%8E Query String %E5%82%B3%E9%80%B2%E5%8E%BB%E9%82%A3%E6%A8%A3%E3%80%82%E5%90%8C%E6%A8%A3%E7%9A%84%EF%BC%8Cparams%5B:action%5D %E4%B9%9F%E6%9C%83%E8%A2%AB%E8%A8%AD%E6%88%90 index%E3%80%82%0A%0A%0A\n ## H\n",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"ruby\",\"rails\"],\"users\":[\"page\"],\"image\":[\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png\",\"https://i.imgur.com/mQE0kSh.png\",\"https://i.imgur.com/3QTOsFH.png\"],\"links\":[\"http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html\",\"https://rails.ruby.tw/action_controller_overview.html\",\"https://ihower.tw/rails/routing.html\",\"https://gist.github.com/cdmwebs/1209732\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "rails-rails-params",
      "title": "[Rails]如何使用Rails中的params"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T13:47:48",
  "trx_id": "8e34259b6e31225c58406de303e08a45a549ceba",
  "trx_in_block": 2,
  "virtual_op": 0
}
linjiahungpublished a new post: rails-model
2018/06/01 13:40:54
authorlinjiahung
body![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png) 一般來說,將資料存入資料庫前,為了確保資料的有效性,通常都會透過驗證來確保只有有效的資料才能存入資料庫。 雖然前端通常也會透過HTML和JS進行驗證,但難保不會有人關掉JS、會自行重新建立一組相似的表單。 而在Model層級驗證資料是最好的,只有通過驗證的資料方可存入資料庫。因為在 Model 層面驗證,不需要考慮資料庫的種類、無法在用戶端(瀏覽器)跳過驗證、且更容易測試與維護。 以下會針對一些驗證常見的重要觀念解釋。像是觸發驗證時機、會與不會觸發驗證的方法、如何手動加入錯誤訊息等等。 ## 驗證觸發時機 Rails的驗證基本上只會在物件要被儲存、或是更動到資料庫時才會被觸發。 也就是說,當我們新增了一個Product的物件,但是還沒存到資料庫時,是不會觸發驗證的。因為這個時候此物件還不屬於資料庫,並不會觸發驗證。 如果我們想知道一個物件是否已經被存入資料庫中,可以透過`new_record?`這個方法。 ```ruby product = Product.new product.new_recored? => true product.save product.new_record? => false ``` ## 會觸發驗證的方法 以下幾個方法會觸發驗證 >create create! save save! update update! 另外值得注意的是,使用有Bang(!)的方法時,如果資料無效會拋出Exception(異常);沒有Bang的則不會 ## 不會觸發驗證的方法 以下的方法不會觸發驗證,將資料存入資料庫的時候不會考慮資料的有效性 > decrement! decrement_counter increment! increment_counter toggle! touch update_all update_attribute update_column update_columns update_counters ## 自行觸發驗證 如果平時要自己觸發驗證,而不想要將資料存到資料庫中,可以透過`valid?`或是`invalid?`來觸發。 如果資料是有效的,`valid?`會回傳true;反之亦然。而`invalid?`的情況跟`valid?`完全相反。 ## errors(驗證錯誤訊息) errors這個方法會回傳一個`ActiveModel::Errors` 類別的實體,包含了所有的錯誤。屬性名稱為鍵,值為由錯誤訊息字串組成的陣列。 ``` p = Product.new p.errors => #<ActiveModel::Errors:0x007faae10f6368 @base=#<Product id: nil, user: nil, template: nil, created_at: nil, updated_at: nil>, @messages={}, @details={}> ``` ### errors.messages(得到所有錯誤訊息) 當驗證物件出現錯誤時,所有的錯誤訊息可以在使用errors.message這個方法來取得。 ```ruby= class Product < ActiveRecord::Base validates :title, presence: true validates :sku, length: { minimum: 2 } end p = Product.create(sku: "ab") (0.1ms) begin transaction (0.2ms) rollback transaction => #<Product id: nil, title: nil, sku: nil, template: nil, created_at: nil, updated_at: nil> p.errors.messages => {:title=>["can't be blank"], :sku=>["is too short (minimum is 4 characters)"]} ``` 需要注意的是,當你執行new的方法產生實體時,即使有錯誤也不會出現在錯誤訊息中,因為new並不觸發驗證。 ```ruby= class Product < ActiveRecord::Base validates :title, presence: true end product = Product.new product.errors.messages => {} product.valid? # => false product.errors.messages => {:title=>["can't be blank"]} ``` ### errors[:attribute](得到特定屬性的錯誤訊息) errors[:attribute]用來得到特定屬性的錯誤訊息。如果該屬性沒有錯誤訊息,則回傳空陣列 ``` class Product < ActiveRecord::Base validates :title, presence: true validates :sku, length: { minimum: 2 } end p = Product.create(title: "books", sku: "ab") p.errors[:sku] => ["is too short (minimum is 4 characters)"] p.errors[:title] => [] ``` ### errors.add(手動加入特定屬性的錯誤訊息) 平時在驗證時如果物件無效,會產生預設的錯誤訊息。如果我們想要自己手動加入針對特定屬性的錯誤訊息,我們可以過`erros.add`這個方法幫我們達成目的。 使用方法是第一個參數為屬性、第二個參數為手動加入的錯誤訊息。 以下我們會透過自行設定一個驗證方法來呈現。 ```ruby= class Product < ApplicationRecord validate :title_validator private def title_validator unless title.present? errors.add(:title, "Title不能是空的喔!") end end end product = Product.create (0.1ms) begin transaction (0.1ms) rollback transaction => #<Order id: nil, title: nil, created_at: nil, updated_at: nil> product.errors.messages => {:title=>["Title不能是空的喔!"]} ``` 又或者你可以透過`<<`將錯誤訊息加入屬性中 ```ruby= class Product < ApplicationRecord validate :title_validator private def title_validator unless title.present? errors[:title] << "Title不能是空的喔!" end end end product = Product.create (0.1ms) begin transaction (0.1ms) rollback transaction => #<Order id: nil, title: nil, created_at: nil, updated_at: nil> product.errors.messages => {:title=>["Title不能是空的喔!"]} ``` ### errors[:base](為整個物件加入錯誤訊息,不針對某個屬性) 如果我們想為整個物件加入錯誤訊息,可以透過`errors[:base]`來加入。你同樣可以使用`add`或`<<`的方式來達成。 ```ruby= class Product < ApplicationRecord validate :title_validator private def title_validator unless title.present? errors[:base] << "測試錯誤訊息") # errors.add(:base, "測試錯誤訊息") end end end product = Product.create (0.1ms) begin transaction (0.1ms) rollback transaction => #<Order id: nil, title: nil, created_at: nil, updated_at: nil> product.errors[:base] => ["測試錯誤訊息"] ``` ### errors.clear(清除所有錯誤訊息) 使用`errors.clear` 方法可以清除 errors 集合裡的所有錯誤。不過這個過程並不涉及任何驗證過程,也不會改變一個物件的有效性。 當下一次觸發驗證時,如果有錯誤訊息仍舊會重新填入errors集合。 ``` class Product < ActiveRecord::Base validates :title, presence: true validates :sku, length: { minimum: 2 } end p = Product.create(title: "books", sku: "ab") p.errors.messages => {:sku=>["is too short (minimum is 4 characters)"] } p.errors.clear => {} p.errors.messages => {} p.save p.errors.messages => {:sku=>["is too short (minimum is 4 characters)"] } ``` ## 自訂驗證方法 我們在上面的文章中便已經有實作過自訂驗證方法,一般的做法是定義一個private method,並透過`validate`來註冊這個method ```ruby= class Invoice < ActiveRecord::Base validate :expiration_date_cannot_be_in_the_past private def expiration_date_cannot_be_in_the_past if expiration_date.present? && expiration_date < Date.today errors.add(:expiration_date, "can't be in the past") end end end ``` ## 常見輔助驗證方法 在Rails中有許多常見的輔助驗證方法,像是 > acceptance > presence > congirmation > format > ...等等 看更多輔助驗證方法可以參考[Validation Helpers](http://guides.rubyonrails.org/active_record_validations.html#validation-helpers) 參考資料 [Active Record Validations](http://guides.rubyonrails.org/active_record_validations.html#validation-helpers) [為你自己學為你自己學 Ruby on Rails — Model 驗證及回呼](https://railsbook.tw/chapters/19-model-validation-and-callback.html)
json metadata{"tags":["cn","cn-reader","blog","ruby","rails"],"image":["https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png"],"links":["http://guides.rubyonrails.org/active_record_validations.html#validation-helpers","https://railsbook.tw/chapters/19-model-validation-and-callback.html"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcn
permlinkrails-model
title[Rails]Model驗證中常見的重要觀念
Transaction InfoBlock #22942265/Trx b72b4d50a14aa3ae271da0f50b365506e3422bd4
View Raw JSON Data
{
  "block": 22942265,
  "op": [
    "comment",
    {
      "author": "linjiahung",
      "body": "![](https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png)\n一般來說,將資料存入資料庫前,為了確保資料的有效性,通常都會透過驗證來確保只有有效的資料才能存入資料庫。\n\n雖然前端通常也會透過HTML和JS進行驗證,但難保不會有人關掉JS、會自行重新建立一組相似的表單。\n\n而在Model層級驗證資料是最好的,只有通過驗證的資料方可存入資料庫。因為在 Model 層面驗證,不需要考慮資料庫的種類、無法在用戶端(瀏覽器)跳過驗證、且更容易測試與維護。\n\n以下會針對一些驗證常見的重要觀念解釋。像是觸發驗證時機、會與不會觸發驗證的方法、如何手動加入錯誤訊息等等。\n\n## 驗證觸發時機\nRails的驗證基本上只會在物件要被儲存、或是更動到資料庫時才會被觸發。\n\n也就是說,當我們新增了一個Product的物件,但是還沒存到資料庫時,是不會觸發驗證的。因為這個時候此物件還不屬於資料庫,並不會觸發驗證。\n\n如果我們想知道一個物件是否已經被存入資料庫中,可以透過`new_record?`這個方法。\n\n```ruby\nproduct = Product.new\nproduct.new_recored?\n=> true\nproduct.save\nproduct.new_record?\n=> false\n```\n\n## 會觸發驗證的方法\n以下幾個方法會觸發驗證\n\n>create\ncreate!\nsave\nsave!\nupdate\nupdate!\n\n另外值得注意的是,使用有Bang(!)的方法時,如果資料無效會拋出Exception(異常);沒有Bang的則不會\n\n## 不會觸發驗證的方法\n以下的方法不會觸發驗證,將資料存入資料庫的時候不會考慮資料的有效性\n\n> decrement!\ndecrement_counter\nincrement!\nincrement_counter\ntoggle!\ntouch\nupdate_all\nupdate_attribute\nupdate_column\nupdate_columns\nupdate_counters\n\n## 自行觸發驗證\n如果平時要自己觸發驗證,而不想要將資料存到資料庫中,可以透過`valid?`或是`invalid?`來觸發。\n\n如果資料是有效的,`valid?`會回傳true;反之亦然。而`invalid?`的情況跟`valid?`完全相反。\n\n## errors(驗證錯誤訊息)\nerrors這個方法會回傳一個`ActiveModel::Errors` 類別的實體,包含了所有的錯誤。屬性名稱為鍵,值為由錯誤訊息字串組成的陣列。\n\n```\np = Product.new\np.errors\n=> #<ActiveModel::Errors:0x007faae10f6368 @base=#<Product id: nil, user: nil, template: nil, created_at: nil, updated_at: nil>, @messages={}, @details={}>\n```\n\n### errors.messages(得到所有錯誤訊息)\n當驗證物件出現錯誤時,所有的錯誤訊息可以在使用errors.message這個方法來取得。\n\n```ruby=\nclass Product < ActiveRecord::Base\n  validates :title, presence: true\n  validates :sku, length: { minimum: 2 }\nend\n\np = Product.create(sku: \"ab\")\n(0.1ms)  begin transaction\n(0.2ms)  rollback transaction\n=> #<Product id: nil, title: nil, sku: nil, template: nil, created_at: nil, updated_at: nil>\n\np.errors.messages\n=> {:title=>[\"can't be blank\"], :sku=>[\"is too short (minimum is 4 characters)\"]}\n```\n\n需要注意的是,當你執行new的方法產生實體時,即使有錯誤也不會出現在錯誤訊息中,因為new並不觸發驗證。\n\n```ruby=\nclass Product < ActiveRecord::Base\n  validates :title, presence: true\nend\n\nproduct = Product.new\nproduct.errors.messages\n=> {}\n\nproduct.valid? # => false\nproduct.errors.messages\n=> {:title=>[\"can't be blank\"]}\n```\n\n\n### errors[:attribute](得到特定屬性的錯誤訊息)\nerrors[:attribute]用來得到特定屬性的錯誤訊息。如果該屬性沒有錯誤訊息,則回傳空陣列\n\n```\nclass Product < ActiveRecord::Base\n  validates :title, presence: true\n  validates :sku, length: { minimum: 2 }\nend\n\np = Product.create(title: \"books\", sku: \"ab\")\np.errors[:sku]\n=> [\"is too short (minimum is 4 characters)\"]\np.errors[:title]\n=> []\n```\n### errors.add(手動加入特定屬性的錯誤訊息)\n平時在驗證時如果物件無效,會產生預設的錯誤訊息。如果我們想要自己手動加入針對特定屬性的錯誤訊息,我們可以過`erros.add`這個方法幫我們達成目的。\n\n使用方法是第一個參數為屬性、第二個參數為手動加入的錯誤訊息。\n\n以下我們會透過自行設定一個驗證方法來呈現。\n```ruby=\nclass Product < ApplicationRecord\n  validate :title_validator\n\n  private\n    def title_validator\n      unless title.present?\n        errors.add(:title, \"Title不能是空的喔!\")\n      end\n    end\nend\nproduct = Product.create\n(0.1ms)  begin transaction\n(0.1ms)  rollback transaction\n => #<Order id: nil, title: nil, created_at: nil, updated_at: nil>\nproduct.errors.messages\n => {:title=>[\"Title不能是空的喔!\"]}\n```\n\n又或者你可以透過`<<`將錯誤訊息加入屬性中\n```ruby=\nclass Product < ApplicationRecord\n  validate :title_validator\n\n  private\n    def title_validator\n      unless title.present?\n        errors[:title] << \"Title不能是空的喔!\"\n      end\n    end\nend\n\nproduct = Product.create\n(0.1ms)  begin transaction\n(0.1ms)  rollback transaction\n=> #<Order id: nil, title: nil, created_at: nil, updated_at: nil>\nproduct.errors.messages\n=> {:title=>[\"Title不能是空的喔!\"]}\n```\n### errors[:base](為整個物件加入錯誤訊息,不針對某個屬性)\n如果我們想為整個物件加入錯誤訊息,可以透過`errors[:base]`來加入。你同樣可以使用`add`或`<<`的方式來達成。\n```ruby=\nclass Product < ApplicationRecord\n  validate :title_validator\n\n  private\n    def title_validator\n      unless title.present?\n        errors[:base] << \"測試錯誤訊息\")\n        # errors.add(:base, \"測試錯誤訊息\")\n      end\n    end\nend\n\nproduct = Product.create\n(0.1ms)  begin transaction\n(0.1ms)  rollback transaction\n=> #<Order id: nil, title: nil, created_at: nil, updated_at: nil>\nproduct.errors[:base]\n=> [\"測試錯誤訊息\"]\n```\n### errors.clear(清除所有錯誤訊息)\n使用`errors.clear` 方法可以清除 errors 集合裡的所有錯誤。不過這個過程並不涉及任何驗證過程,也不會改變一個物件的有效性。\n\n當下一次觸發驗證時,如果有錯誤訊息仍舊會重新填入errors集合。\n\n```\nclass Product < ActiveRecord::Base\n  validates :title, presence: true\n  validates :sku, length: { minimum: 2 }\nend\n\np = Product.create(title: \"books\", sku: \"ab\")\np.errors.messages\n=> {:sku=>[\"is too short (minimum is 4 characters)\"] }\np.errors.clear\n=> {}\np.errors.messages\n=> {}\np.save\np.errors.messages\n=> {:sku=>[\"is too short (minimum is 4 characters)\"] }\n```\n\n## 自訂驗證方法\n我們在上面的文章中便已經有實作過自訂驗證方法,一般的做法是定義一個private method,並透過`validate`來註冊這個method\n\n```ruby=\nclass Invoice < ActiveRecord::Base\n  validate :expiration_date_cannot_be_in_the_past\n    \n    \n  private\n    def expiration_date_cannot_be_in_the_past\n      if expiration_date.present? && expiration_date < Date.today\n        errors.add(:expiration_date, \"can't be in the past\")\n      end\n    end\nend\n```\n\n## 常見輔助驗證方法\n在Rails中有許多常見的輔助驗證方法,像是\n> acceptance\n> presence\n> congirmation\n> format\n> ...等等\n\n看更多輔助驗證方法可以參考[Validation Helpers](http://guides.rubyonrails.org/active_record_validations.html#validation-helpers)\n\n參考資料\n[Active Record Validations](http://guides.rubyonrails.org/active_record_validations.html#validation-helpers)\n[為你自己學為你自己學 Ruby on Rails — Model 驗證及回呼](https://railsbook.tw/chapters/19-model-validation-and-callback.html)",
      "json_metadata": "{\"tags\":[\"cn\",\"cn-reader\",\"blog\",\"ruby\",\"rails\"],\"image\":[\"https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Ruby_On_Rails_Logo.svg/1280px-Ruby_On_Rails_Logo.svg.png\"],\"links\":[\"http://guides.rubyonrails.org/active_record_validations.html#validation-helpers\",\"https://railsbook.tw/chapters/19-model-validation-and-callback.html\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "cn",
      "permlink": "rails-model",
      "title": "[Rails]Model驗證中常見的重要觀念"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T13:40:54",
  "trx_id": "b72b4d50a14aa3ae271da0f50b365506e3422bd4",
  "trx_in_block": 9,
  "virtual_op": 0
}
2018/06/01 12:06:27
idfollow
json["follow",{"follower":"linjiahung","following":"nolla","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940377/Trx 2d7571cace2641514d7fc09d14b87c676f1922f2
View Raw JSON Data
{
  "block": 22940377,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"nolla\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:06:27",
  "trx_id": "2d7571cace2641514d7fc09d14b87c676f1922f2",
  "trx_in_block": 0,
  "virtual_op": 0
}
2018/06/01 12:06:15
idfollow
json["follow",{"follower":"linjiahung","following":"ghadir","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940373/Trx 7095e34f166321959b8238e3075a10bca246f2d1
View Raw JSON Data
{
  "block": 22940373,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"ghadir\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:06:15",
  "trx_id": "7095e34f166321959b8238e3075a10bca246f2d1",
  "trx_in_block": 30,
  "virtual_op": 0
}
2018/06/01 12:06:12
idfollow
json["follow",{"follower":"linjiahung","following":"happo","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940372/Trx efd252a11e2a5ca30883db9759103a9f9cc78266
View Raw JSON Data
{
  "block": 22940372,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"happo\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:06:12",
  "trx_id": "efd252a11e2a5ca30883db9759103a9f9cc78266",
  "trx_in_block": 12,
  "virtual_op": 0
}
2018/06/01 12:06:06
idfollow
json["follow",{"follower":"linjiahung","following":"greel","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940370/Trx 5af3ab25a7b6cf56238647e2d8bbee5090a7e83f
View Raw JSON Data
{
  "block": 22940370,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"greel\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:06:06",
  "trx_id": "5af3ab25a7b6cf56238647e2d8bbee5090a7e83f",
  "trx_in_block": 58,
  "virtual_op": 0
}
2018/06/01 12:06:03
idfollow
json["follow",{"follower":"linjiahung","following":"igora","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940369/Trx 4c88a83813e360288e0160bda6133408d8e7f8e7
View Raw JSON Data
{
  "block": 22940369,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"igora\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:06:03",
  "trx_id": "4c88a83813e360288e0160bda6133408d8e7f8e7",
  "trx_in_block": 4,
  "virtual_op": 0
}
2018/06/01 12:05:57
idfollow
json["follow",{"follower":"linjiahung","following":"hesamali","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940367/Trx ebda3fa609cb1e02d9e55b12a50b459d7c636f81
View Raw JSON Data
{
  "block": 22940367,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"hesamali\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:57",
  "trx_id": "ebda3fa609cb1e02d9e55b12a50b459d7c636f81",
  "trx_in_block": 24,
  "virtual_op": 0
}
2018/06/01 12:05:51
idfollow
json["follow",{"follower":"linjiahung","following":"jacobe","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940365/Trx 6dbdd34c4d4b5a4f6c74b82d6cc9e5033e1b5c59
View Raw JSON Data
{
  "block": 22940365,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"jacobe\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:51",
  "trx_id": "6dbdd34c4d4b5a4f6c74b82d6cc9e5033e1b5c59",
  "trx_in_block": 19,
  "virtual_op": 0
}
2018/06/01 12:05:45
idfollow
json["follow",{"follower":"linjiahung","following":"jasmeen","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940363/Trx 1e30950ba10d671e9d3809e97a70738d1e4fe9ab
View Raw JSON Data
{
  "block": 22940363,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"jasmeen\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:45",
  "trx_id": "1e30950ba10d671e9d3809e97a70738d1e4fe9ab",
  "trx_in_block": 8,
  "virtual_op": 0
}
2018/06/01 12:05:36
idfollow
json["follow",{"follower":"linjiahung","following":"jommo","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940360/Trx 9b24d550fc01b6df802f67e275721e9af644e8c0
View Raw JSON Data
{
  "block": 22940360,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"jommo\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:36",
  "trx_id": "9b24d550fc01b6df802f67e275721e9af644e8c0",
  "trx_in_block": 33,
  "virtual_op": 0
}
2018/06/01 12:05:33
idfollow
json["follow",{"follower":"linjiahung","following":"katee","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940359/Trx 788af459ccf885e3e094d545565c9f049f09512b
View Raw JSON Data
{
  "block": 22940359,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"katee\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:33",
  "trx_id": "788af459ccf885e3e094d545565c9f049f09512b",
  "trx_in_block": 2,
  "virtual_op": 0
}
2018/06/01 12:05:18
idfollow
json["follow",{"follower":"linjiahung","following":"kimwoo","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940354/Trx 0ddd490e71d35dfceafe74327f3b56287509bd1c
View Raw JSON Data
{
  "block": 22940354,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"kimwoo\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:18",
  "trx_id": "0ddd490e71d35dfceafe74327f3b56287509bd1c",
  "trx_in_block": 34,
  "virtual_op": 0
}
2018/06/01 12:05:15
idfollow
json["follow",{"follower":"linjiahung","following":"koobix","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940353/Trx a76284203ba40e835c14603e70e5ee71719828a7
View Raw JSON Data
{
  "block": 22940353,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"koobix\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:15",
  "trx_id": "a76284203ba40e835c14603e70e5ee71719828a7",
  "trx_in_block": 12,
  "virtual_op": 0
}
2018/06/01 12:05:03
idfollow
json["follow",{"follower":"linjiahung","following":"koolis","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940349/Trx a9123a6a00bde1da9797183e7a3a3ed73e49ecc2
View Raw JSON Data
{
  "block": 22940349,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"koolis\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:05:03",
  "trx_id": "a9123a6a00bde1da9797183e7a3a3ed73e49ecc2",
  "trx_in_block": 36,
  "virtual_op": 0
}
2018/06/01 12:04:54
idfollow
json["follow",{"follower":"linjiahung","following":"ladano","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940346/Trx 3e9fea196cde48903a192b4a13db5ae7e766b2e5
View Raw JSON Data
{
  "block": 22940346,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"ladano\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:04:54",
  "trx_id": "3e9fea196cde48903a192b4a13db5ae7e766b2e5",
  "trx_in_block": 18,
  "virtual_op": 0
}
2018/06/01 12:04:48
idfollow
json["follow",{"follower":"linjiahung","following":"larison","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940344/Trx f717b9c52fec27876ddf1bc4f4478f0a94e23933
View Raw JSON Data
{
  "block": 22940344,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"larison\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:04:48",
  "trx_id": "f717b9c52fec27876ddf1bc4f4478f0a94e23933",
  "trx_in_block": 42,
  "virtual_op": 0
}
2018/06/01 12:04:24
idfollow
json["follow",{"follower":"linjiahung","following":"larix","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940336/Trx 55b6aaad6a1181a9e83e0426b314d7417e5e4601
View Raw JSON Data
{
  "block": 22940336,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"larix\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:04:24",
  "trx_id": "55b6aaad6a1181a9e83e0426b314d7417e5e4601",
  "trx_in_block": 49,
  "virtual_op": 0
}
2018/06/01 12:04:09
idfollow
json["follow",{"follower":"linjiahung","following":"lenzy","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940331/Trx d9a7398cc88eaf7fdb32171615bc7ea1e76695fd
View Raw JSON Data
{
  "block": 22940331,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"lenzy\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:04:09",
  "trx_id": "d9a7398cc88eaf7fdb32171615bc7ea1e76695fd",
  "trx_in_block": 36,
  "virtual_op": 0
}
2018/06/01 12:04:03
idfollow
json["follow",{"follower":"linjiahung","following":"letibia80","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940329/Trx 768133cb6096fabb665e0325891bf69fffb46780
View Raw JSON Data
{
  "block": 22940329,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"letibia80\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:04:03",
  "trx_id": "768133cb6096fabb665e0325891bf69fffb46780",
  "trx_in_block": 29,
  "virtual_op": 0
}
2018/06/01 12:04:00
idfollow
json["follow",{"follower":"linjiahung","following":"lomo","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940328/Trx 3dd8c2f33f0906e7ed424eba3eeb85be96cc58ec
View Raw JSON Data
{
  "block": 22940328,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"lomo\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:04:00",
  "trx_id": "3dd8c2f33f0906e7ed424eba3eeb85be96cc58ec",
  "trx_in_block": 0,
  "virtual_op": 0
}
2018/06/01 12:03:51
idfollow
json["follow",{"follower":"linjiahung","following":"livo","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22940325/Trx 84d0c3ce9564ce0bbcc443ad528db736445d126a
View Raw JSON Data
{
  "block": 22940325,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"livo\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-01T12:03:51",
  "trx_id": "84d0c3ce9564ce0bbcc443ad528db736445d126a",
  "trx_in_block": 9,
  "virtual_op": 0
}
2018/05/31 15:39:36
authorlinjiahung
permlinkrails-rails-params
voterrivalhw
weight1100 (11.00%)
Transaction InfoBlock #22915852/Trx 7407acbd464b0f2dd6b4a9a791329bd3ee5e23b1
View Raw JSON Data
{
  "block": 22915852,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "rails-rails-params",
      "voter": "rivalhw",
      "weight": 1100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T15:39:36",
  "trx_id": "7407acbd464b0f2dd6b4a9a791329bd3ee5e23b1",
  "trx_in_block": 53,
  "virtual_op": 0
}
steemdelegated 15.176 SP to @linjiahung
2018/05/31 15:30:09
delegateelinjiahung
delegatorsteem
vesting shares24679.428581 VESTS
Transaction InfoBlock #22915664/Trx af32bfb75ab01b4e4182c748db406a2a6b478519
View Raw JSON Data
{
  "block": 22915664,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "linjiahung",
      "delegator": "steem",
      "vesting_shares": "24679.428581 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T15:30:09",
  "trx_id": "af32bfb75ab01b4e4182c748db406a2a6b478519",
  "trx_in_block": 5,
  "virtual_op": 0
}
2018/05/31 14:58:06
authortensaix2j
permlinkruby-transfer
voterlinjiahung
weight10000 (100.00%)
Transaction InfoBlock #22915023/Trx 3b6114a9fd9a10f72b246e198fab585e510d5349
View Raw JSON Data
{
  "block": 22915023,
  "op": [
    "vote",
    {
      "author": "tensaix2j",
      "permlink": "ruby-transfer",
      "voter": "linjiahung",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T14:58:06",
  "trx_id": "3b6114a9fd9a10f72b246e198fab585e510d5349",
  "trx_in_block": 31,
  "virtual_op": 0
}
2018/05/31 14:57:15
idfollow
json["follow",{"follower":"linjiahung","following":"elik","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22915006/Trx 7364c931b810e36415a21ed9323e13223845ffc4
View Raw JSON Data
{
  "block": 22915006,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"elik\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T14:57:15",
  "trx_id": "7364c931b810e36415a21ed9323e13223845ffc4",
  "trx_in_block": 0,
  "virtual_op": 0
}
2018/05/31 14:57:09
idfollow
json["follow",{"follower":"linjiahung","following":"faridline","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22915004/Trx 2643e1a848143c99e396d806b621adab25ea4b22
View Raw JSON Data
{
  "block": 22915004,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"faridline\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T14:57:09",
  "trx_id": "2643e1a848143c99e396d806b621adab25ea4b22",
  "trx_in_block": 23,
  "virtual_op": 0
}
2018/05/31 14:57:06
idfollow
json["follow",{"follower":"linjiahung","following":"adran","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22915003/Trx 0e5e1ec7fd4df5b2551a9bdb52cb052e5cea57f6
View Raw JSON Data
{
  "block": 22915003,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"adran\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T14:57:06",
  "trx_id": "0e5e1ec7fd4df5b2551a9bdb52cb052e5cea57f6",
  "trx_in_block": 38,
  "virtual_op": 0
}
linjiahungclaimed reward balance: 0.004 STEEM, 0.199 SBD, 0.120 SP
2018/05/31 14:54:45
accountlinjiahung
reward sbd0.199 SBD
reward steem0.004 STEEM
reward vests195.672540 VESTS
Transaction InfoBlock #22914956/Trx 5ee981bdaab3400709c3db564efec78204e74bb5
View Raw JSON Data
{
  "block": 22914956,
  "op": [
    "claim_reward_balance",
    {
      "account": "linjiahung",
      "reward_sbd": "0.199 SBD",
      "reward_steem": "0.004 STEEM",
      "reward_vests": "195.672540 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T14:54:45",
  "trx_id": "5ee981bdaab3400709c3db564efec78204e74bb5",
  "trx_in_block": 30,
  "virtual_op": 0
}
2018/05/31 10:56:51
authorlinjiahung
permlinkrails-rails-render-1
votercoldhair
weight400 (4.00%)
Transaction InfoBlock #22910201/Trx 6254a680cf10a4729822a555d7f26a5330b83313
View Raw JSON Data
{
  "block": 22910201,
  "op": [
    "vote",
    {
      "author": "linjiahung",
      "permlink": "rails-rails-render-1",
      "voter": "coldhair",
      "weight": 400
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T10:56:51",
  "trx_id": "6254a680cf10a4729822a555d7f26a5330b83313",
  "trx_in_block": 30,
  "virtual_op": 0
}
2018/05/31 06:28:57
idfollow
json["follow",{"follower":"linjiahung","following":"nadsteem","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22904843/Trx 2b7242c7dde072b60bbdea1732ac29edb91c46c4
View Raw JSON Data
{
  "block": 22904843,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"nadsteem\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T06:28:57",
  "trx_id": "2b7242c7dde072b60bbdea1732ac29edb91c46c4",
  "trx_in_block": 3,
  "virtual_op": 0
}
2018/05/31 06:28:33
idfollow
json["follow",{"follower":"linjiahung","following":"hr1","what":["blog"]}]
required auths[]
required posting auths["linjiahung"]
Transaction InfoBlock #22904835/Trx 47d584980d285054e2bf931d621858808fb50c92
View Raw JSON Data
{
  "block": 22904835,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"linjiahung\",\"following\":\"hr1\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "linjiahung"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-31T06:28:33",
  "trx_id": "47d584980d285054e2bf931d621858808fb50c92",
  "trx_in_block": 25,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://scontent.ftpe7-4.fna.fbcdn.net/v/t1.0-1/p160x160/12274451_1118296284856641_6343258697106219339_n.jpg?oh=11ec975e8fae084bb13568d465b6b7c4&oe=5AD132B5","about":"Programmer, writer, lifelong learner","location":"Taiwan","website":"http://www.createyourownlives.com"}
JSON METADATA
profile{"profile_image":"https://scontent.ftpe7-4.fna.fbcdn.net/v/t1.0-1/p160x160/12274451_1118296284856641_6343258697106219339_n.jpg?oh=11ec975e8fae084bb13568d465b6b7c4&oe=5AD132B5","about":"Programmer, writer, lifelong learner","location":"Taiwan","website":"http://www.createyourownlives.com"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://scontent.ftpe7-4.fna.fbcdn.net/v/t1.0-1/p160x160/12274451_1118296284856641_6343258697106219339_n.jpg?oh=11ec975e8fae084bb13568d465b6b7c4&oe=5AD132B5",
      "about": "Programmer, writer, lifelong learner",
      "location": "Taiwan",
      "website": "http://www.createyourownlives.com"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://scontent.ftpe7-4.fna.fbcdn.net/v/t1.0-1/p160x160/12274451_1118296284856641_6343258697106219339_n.jpg?oh=11ec975e8fae084bb13568d465b6b7c4&oe=5AD132B5",
      "about": "Programmer, writer, lifelong learner",
      "location": "Taiwan",
      "website": "http://www.createyourownlives.com"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM8dXZeDd1vqhC4h5E7hLwWfSETFbyH4pZ2B386HtxbpGGST8TLW1/1
Active
Single Signature
Public Keys
STM5ikxHXmSd2EwaGc3EZEUTTe2z5NzhamyGNFs4oXTcayZFDA3PH1/1
Posting
Single Signature
Public Keys
STM7LHqjoK2xfkSmnBZ1mY7VPeN5zkMjfxPEnT3CmvNX4qqyjjEfW1/1
Memo
STM5YWn6xpzHhHKrvj2VdwyucSURRdp2XRBNrZfT1ifqbMiu8hz7M
{
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8dXZeDd1vqhC4h5E7hLwWfSETFbyH4pZ2B386HtxbpGGST8TLW",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM5ikxHXmSd2EwaGc3EZEUTTe2z5NzhamyGNFs4oXTcayZFDA3PH",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM7LHqjoK2xfkSmnBZ1mY7VPeN5zkMjfxPEnT3CmvNX4qqyjjEfW",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "memo": "STM5YWn6xpzHhHKrvj2VdwyucSURRdp2XRBNrZfT1ifqbMiu8hz7M"
}

Witness Votes

0 / 30
No active witness votes.
[]