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 DelegationsDeleg
+1.185SP
Detailed Balance
| STEEM | ||
| balance | 0.026STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 3.822SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 1.185SP | SP |
| Effective Power | 5.008SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 7.145SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"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
| name | linjiahung |
| id | 489060 |
| rank | 903,396 |
| reputation | 52718592076 |
| created | 2017-12-12T03:03:12 |
| recovery_account | steem |
| proxy | None |
| post_count | 57 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2018-10-16T16:07:45 |
| last_root_post | 2018-10-16T16:07:45 |
| last_vote_time | 2018-05-31T14:58:06 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.026 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 7.145 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 6216.014094 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 1927.645712 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2017-12-12T03:16:33 |
| mined | No |
| sbd_seconds | 13,399,266,459 |
| sbd_last_interest_payment | 2018-05-31T14:54:45 |
| savings_sbd_last_interest_payment | 1970-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
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
steemdelegated 1.185 SP to @linjiahung2026/05/18 02:59:12
steemdelegated 1.185 SP to @linjiahung
2026/05/18 02:59:12
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 1927.645712 VESTS |
| Transaction Info | Block #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 @linjiahung2026/05/12 14:53:39
steemdelegated 1.002 SP to @linjiahung
2026/05/12 14:53:39
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 1629.434820 VESTS |
| Transaction Info | Block #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 @linjiahung2026/04/26 02:15:51
steemdelegated 1.193 SP to @linjiahung
2026/04/26 02:15:51
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 1940.161468 VESTS |
| Transaction Info | Block #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 @linjiahung2023/11/14 02:02:54
steemdelegated 1.071 SP to @linjiahung
2023/11/14 02:02:54
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 1741.904685 VESTS |
| Transaction Info | Block #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 @linjiahung2023/09/22 01:02:18
steemdelegated 1.554 SP to @linjiahung
2023/09/22 01:02:18
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 2527.613641 VESTS |
| Transaction Info | Block #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 @linjiahung2022/11/03 14:26:18
steemdelegated 1.691 SP to @linjiahung
2022/11/03 14:26:18
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 2749.295079 VESTS |
| Transaction Info | Block #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 @linjiahung2022/01/17 17:44:12
steemdelegated 1.826 SP to @linjiahung
2022/01/17 17:44:12
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 2969.530215 VESTS |
| Transaction Info | Block #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 @linjiahung2021/06/14 03:16:48
steemdelegated 1.939 SP to @linjiahung
2021/06/14 03:16:48
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 3153.596968 VESTS |
| Transaction Info | Block #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 @linjiahung2020/12/11 13:32:33
steemdelegated 2.054 SP to @linjiahung
2020/12/11 13:32:33
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 3341.018942 VESTS |
| Transaction Info | Block #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 @linjiahung2020/12/06 07:09:03
steemdelegated 1.176 SP to @linjiahung
2020/12/06 07:09:03
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #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 @linjiahung2020/12/05 17:10:33
steemdelegated 2.058 SP to @linjiahung
2020/12/05 17:10:33
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 3347.226796 VESTS |
| Transaction Info | Block #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 @linjiahung2020/11/02 20:39:06
steemdelegated 1.181 SP to @linjiahung
2020/11/02 20:39:06
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #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 @linjiahung2020/05/09 08:09:03
steemdelegated 2.183 SP to @linjiahung
2020/05/09 08:09:03
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 3550.032155 VESTS |
| Transaction Info | Block #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 @linjiahung2020/05/08 12:07:00
steemdelegated 1.201 SP to @linjiahung
2020/05/08 12:07:00
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #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 @linjiahung2019/12/17 20:13:33
steemdelegated 2.232 SP to @linjiahung
2019/12/17 20:13:33
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 3628.967666 VESTS |
| Transaction Info | Block #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
2019/12/12 03:27:39
| author | steemitboard |
| body | Congratulations @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 author | linjiahung |
| parent permlink | 6v9omv |
| permlink | steemitboard-notify-linjiahung-20191212t032738000z |
| title | |
| Transaction Info | Block #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 @linjiahung2019/01/15 17:47:48
steemdelegated 2.353 SP to @linjiahung
2019/01/15 17:47:48
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 3825.897920 VESTS |
| Transaction Info | Block #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
2018/12/12 03:21:54
| author | steemitboard |
| body | Congratulations @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 author | linjiahung |
| parent permlink | 6v9omv |
| permlink | steemitboard-notify-linjiahung-20181212t032154000z |
| title | |
| Transaction Info | Block #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 / 6v9omv2018/10/16 16:07:54
fastresteemupvoted (1.00%) @linjiahung / 6v9omv
2018/10/16 16:07:54
| author | linjiahung |
| permlink | 6v9omv |
| voter | fastresteem |
| weight | 100 (1.00%) |
| Transaction Info | Block #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: 6v9omv2018/10/16 16:07:45
linjiahungpublished a new post: 6v9omv
2018/10/16 16:07:45
| author | linjiahung |
| body | .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 permlink | cn |
| permlink | 6v9omv |
| title | 為你自己的投資判「無期徒刑」 |
| Transaction Info | Block #26862304/Trx 6ece87125c0c289b2a4b266f98e307e3e069daa3 |
View Raw JSON Data
{
"block": 26862304,
"op": [
"comment",
{
"author": "linjiahung",
"body": ".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: 2jaxnm2018/10/12 14:04:12
linjiahungpublished a new post: 2jaxnm
2018/10/12 14:04:12
| author | linjiahung |
| body | https://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 permlink | cn |
| permlink | 2jaxnm |
| title | 商品大賣讓你以為你賺錢了,但實際上你可能虧大了 |
| Transaction Info | Block #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 @linjiahung2018/10/08 17:19:09
steemdelegated 14.804 SP to @linjiahung
2018/10/08 17:19:09
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 24074.030678 VESTS |
| Transaction Info | Block #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 / 4g2zws2018/10/07 09:01:03
xiaoshancunupvoted (100.00%) @linjiahung / 4g2zws
2018/10/07 09:01:03
| author | linjiahung |
| permlink | 4g2zws |
| voter | xiaoshancun |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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 / 4g2zws2018/10/07 08:33:06
alphabotupvoted (1.00%) @linjiahung / 4g2zws
2018/10/07 08:33:06
| author | linjiahung |
| permlink | 4g2zws |
| voter | alphabot |
| weight | 100 (1.00%) |
| Transaction Info | Block #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: 4g2zws2018/10/07 08:32:57
linjiahungpublished a new post: 4g2zws
2018/10/07 08:32:57
| author | linjiahung |
| body |  最近在思考要如何前進人生的下個階段時,常常會覺得很徬徨,腦海裡完全不知道該如何做才好。 正當我在煩惱自己到底該怎麼辦才好時,我突然想到平常在寫程式的時候,雖然在執行的過程也會遇到種種的困難,但最後基本上總是能夠迎刃而解。 所以我開始好奇:「為什麼寫程式的時候可以解決各種問題,但是面對自己的人生的時候卻常常不知道該如何下手?」 雖然只是工作不久的網頁工程師,但是我發現不論是自己或是公司開發專案時,往往會經歷以下的幾個階段來開發專案 > 1. 接到一個新的專案需求 > 2. 確認這個專案的截止期限是什麼時候 > 3. 思考為了完成這個專案,要個別完成哪些功能? > 4. 這些個別的功能需要花上多少時間? > 5. 這個專案完成的時間,會不會超出截止期限? > 6. 超出的話,是要刪除部分功能、延長專案截止期限,又或者是熬夜加班趕上時程? > 7. 開始開發  工作分配下來之後,難免會遇到一些不熟悉、或是不知道該怎麼實作的功能,而這個部分其實是最困難也最花時間的部分。 因為很多時候你並不知道該怎麼完成這個功能,但是你又不得不完成。如果這個功能太複雜、一開始不知道怎麼入手的話,那就試著「再」把這個功能拆成更小的功能。 接著就是自己研究、上網找資料,或是請教別人;如果花了很多時間還是沒辦法解決,那可以先放下手頭的工作,先去完成其他功能,之後再回頭補上。 一個小功能完成之後,就接著去完成下一個小功能。最後當所有人(或是你自己一個人)把所有的功能都完成之後,這個專案大致上就算是完成了。 所以我在想,如果用程式開發的各個階段來檢視人生的話,會不會也可以使用類似的方法? ## 用類似的思維思考人生 接著就讓我們假設,如果我想達成「財富自由」這個目標,我要如何用類似的方法來拆解並執行? > 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. 要如何執行? 當我這樣一一拆解之後,會發現事實上要完成這個經營公司這個中目標,還有許多的小目標要做。接下來我要做的,就是跟上面程式開發要做的事情類似。 一一的完成這些小目標。如果不知道該怎麼執行,那就研究、請教;如果花了很多時間還是沒辦法解決,那可以先放下手頭的工作,先去完成其他目標,之後再回頭補上。  最後所有的功能都完成之後,這個目標大致上就算是完成了。 在推敲的過程中我發現,我(或是其他人)之所以沒有辦法去完成人生中的目標,往往原因出在 > 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 permlink | cn |
| permlink | 4g2zws |
| title | 用程式開發思維幫助思考人生 |
| Transaction Info | Block #26594202/Trx 21fff01de08eb24d8f4a5515fad9129ac87bcf35 |
View Raw JSON Data
{
"block": 26594202,
"op": [
"comment",
{
"author": "linjiahung",
"body": "\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\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\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 @linjiahung2018/09/22 17:03:39
steemdelegated 2.392 SP to @linjiahung
2018/09/22 17:03:39
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 3889.318011 VESTS |
| Transaction Info | Block #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 @linjiahung2018/06/23 19:00:27
steemdelegated 14.910 SP to @linjiahung
2018/06/23 19:00:27
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 24246.083679 VESTS |
| Transaction Info | Block #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 / 6ee1mk2018/06/23 15:30:27
huangtongtupvoted (100.00%) @linjiahung / 6ee1mk
2018/06/23 15:30:27
| author | linjiahung |
| permlink | 6ee1mk |
| voter | huangtongt |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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: 6ee1mk2018/06/23 15:28:39
linjiahungpublished a new post: 6ee1mk
2018/06/23 15:28:39
| author | linjiahung |
| body |  圖片取自[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 permlink | cn |
| permlink | 6ee1mk |
| title | 要突破困境,先從模仿別人的思維開始 |
| Transaction Info | Block #23577268/Trx 780ffdd9ed28e065580acba94c7b9328e94e5f8a |
View Raw JSON Data
{
"block": 23577268,
"op": [
"comment",
{
"author": "linjiahung",
"body": "\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 SP2018/06/23 15:23:12
linjiahungclaimed reward balance: 0.021 STEEM, 0.408 SBD, 0.244 SP
2018/06/23 15:23:12
| account | linjiahung |
| reward sbd | 0.408 SBD |
| reward steem | 0.021 STEEM |
| reward vests | 396.367580 VESTS |
| Transaction Info | Block #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-12018/06/07 04:23:27
linjiahungreceived 0.005 STEEM, 0.089 SBD, 0.054 SP author reward for @linjiahung / rails-rails-render-1
2018/06/07 04:23:27
| author | linjiahung |
| permlink | rails-rails-render-1 |
| sbd payout | 0.089 SBD |
| steem payout | 0.005 STEEM |
| vesting payout | 87.401490 VESTS |
| Transaction Info | Block #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-params2018/06/06 15:46:12
linjiahungreceived 0.014 STEEM, 0.296 SBD, 0.175 SP author reward for @linjiahung / rails-rails-params
2018/06/06 15:46:12
| author | linjiahung |
| permlink | rails-rails-params |
| sbd payout | 0.296 SBD |
| steem payout | 0.014 STEEM |
| vesting payout | 284.570818 VESTS |
| Transaction Info | Block #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 / rails2018/06/04 13:18:12
linjiahungreceived 0.001 STEEM, 0.007 SBD, 0.005 SP author reward for @linjiahung / rails
2018/06/04 13:18:12
| author | linjiahung |
| permlink | rails |
| sbd payout | 0.007 SBD |
| steem payout | 0.001 STEEM |
| vesting payout | 8.131487 VESTS |
| Transaction Info | Block #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
2018/06/04 10:40:09
| author | bilal-haider |
| body | Bro if you make in english. will help alot more people. Thanks |
| 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 | |
| Transaction Info | Block #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
}bilal-haiderupvoted (100.00%) @linjiahung / rails-rails-render-12018/06/04 10:39:39
bilal-haiderupvoted (100.00%) @linjiahung / rails-rails-render-1
2018/06/04 10:39:39
| author | linjiahung |
| permlink | rails-rails-render-1 |
| voter | bilal-haider |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}linjiahungpublished a new post: 4g9bve-how-to-start-a-company2018/06/03 15:10:54
linjiahungpublished a new post: 4g9bve-how-to-start-a-company
2018/06/03 15:10:54
| author | linjiahung |
| body |  > 商機就像是公車一樣,總會有下一班 — 理查‧布蘭登,維珍集團創辦人 「究竟要選哪個主題創業?」這是個我最近一直在思考的一件事。雖然商機這種東西就像是公車一樣,走了一班下一班還會來。但你總會想—「究竟我應該搭上哪一班公車?」 每當我在思考究竟要選擇哪個主題時,腦海中總會想起孫正義。孫正義是日本軟體銀行的創辦人,並且也以日本首富的名號為人所知。 ## 選擇賽道 他在小時候就立志要成為一個企業家,當他完成在加州柏克萊大學的學業後,他回到了日本準備開始他的企業家生涯。 在他真正開始創業之前他就認知到,創業這件事情,最重要的是選擇賽道,一個能夠讓他投入一生事業的賽道。所以他列出了以下幾個條件做為他選擇事業的原則 > * 是否能讓我在今後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 permlink | cn |
| permlink | 4g9bve-how-to-start-a-company |
| title | 我如何診斷目前自己的問題,並選擇創業主題 — How to start a company 系列 |
| Transaction Info | Block #23001637/Trx 488401076e64535c4c3faac1e0dd5e039ddc1553 |
View Raw JSON Data
{
"block": 23001637,
"op": [
"comment",
{
"author": "linjiahung",
"body": "\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-company2018/06/03 14:25:24
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
| author | linjiahung |
| permlink | 4nwrgw-how-to-start-a-company |
| sbd payout | 0.016 SBD |
| steem payout | 0.001 STEEM |
| vesting payout | 16.263785 VESTS |
| Transaction Info | Block #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: formbuilder2018/06/03 02:48:15
linjiahungpublished a new post: formbuilder
2018/06/03 02:48:15
| author | linjiahung |
| body |  ## 什麼是FormBuilder > 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。 這個翻譯有點拗口,讓我們看看實際的例子。 當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。 ```ruby= <%= form_tag("/pages") do %> <%= label_tag(:user, "User") %> <%= text_field(:pages, :user) %> <%= submit_tag("submit") %> <% end %> ```  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欄位是空白時,我們就可以得到以下的畫面。  這樣的話我們就能夠既使用我們客製化的又不影響本來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 %> ``` 可以達成一樣的效果。  ## 參考資料 [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 permlink | cn |
| permlink | formbuilder |
| title | [Rails]使用FormBuilder自定義你的表單 |
| Transaction Info | Block #22986784/Trx 355d47b82a96f106f8ffb5851bb670deadcca041 |
View Raw JSON Data
{
"block": 22986784,
"op": [
"comment",
{
"author": "linjiahung",
"body": "\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\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\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\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
}linjiahungfollowed @a-0-02018/06/03 02:47:45
linjiahungfollowed @a-0-0
2018/06/03 02:47:45
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"a-0-0","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}cn-cutie.piereplied to @linjiahung / 20180602t141206687z-post2018/06/02 14:12:06
cn-cutie.piereplied to @linjiahung / 20180602t141206687z-post
2018/06/02 14:12:06
| author | cn-cutie.pie |
| body | @linjiahung, 棒棒哒~~~  |
| json metadata | {"tags":["cn"]} |
| parent author | linjiahung |
| parent permlink | formbuilder |
| permlink | 20180602t141206687z-post |
| title | |
| Transaction Info | Block #22971671/Trx 254a82b60f8dc2b17586551f8a99c31513adb9c9 |
View Raw JSON Data
{
"block": 22971671,
"op": [
"comment",
{
"author": "cn-cutie.pie",
"body": "@linjiahung, 棒棒哒~~~ ",
"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
}cn-cutie.pieupvoted (27.64%) @linjiahung / formbuilder2018/06/02 14:12:03
cn-cutie.pieupvoted (27.64%) @linjiahung / formbuilder
2018/06/02 14:12:03
| author | linjiahung |
| permlink | formbuilder |
| voter | cn-cutie.pie |
| weight | 2764 (27.64%) |
| Transaction Info | Block #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: formbuilder2018/06/02 13:59:45
linjiahungpublished a new post: formbuilder
2018/06/02 13:59:45
| author | linjiahung |
| body |  ## 什麼是FormBuilder > 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。 這個翻譯有點拗口,讓我們看看實際的例子。 當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。 ```ruby= <%= form_tag("/pages") do %> <%= label_tag(:user, "User") %> <%= text_field(:pages, :user) %> <%= submit_tag("submit") %> <% end %> ```  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欄位是空白時,我們就可以得到以下的畫面。  這樣的話我們就能夠既使用我們客製化的又不影響本來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 %> ``` 可以達成一樣的效果。  ## 參考資料 [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 permlink | cn |
| permlink | formbuilder |
| title | 使用FormBuilder自定義你的表單 |
| Transaction Info | Block #22971424/Trx 1601a4c19e8afef5c61c53bf1284ca307dc4ee53 |
View Raw JSON Data
{
"block": 22971424,
"op": [
"comment",
{
"author": "linjiahung",
"body": "\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\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\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\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: formbuilder2018/06/02 13:59:24
linjiahungpublished a new post: formbuilder
2018/06/02 13:59:24
| author | linjiahung |
| body |  ## 什麼是FormBuilder > 來自FormBuilder的物件,讓你可以建立跟特定物件相關連的欄位。 這個翻譯有點拗口,讓我們看看實際的例子。 當我們要編輯一個Model的物件時,我們的表單基本上可以寫成這樣。 ```ruby= <%= form_tag("/pages") do %> <%= label_tag(:user, "User") %> <%= text_field(:pages, :user) %> <%= submit_tag("submit") %> <% end %> ```  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欄位是空白時,我們就可以得到以下的畫面。  這樣的話我們就能夠既使用我們客製化的又不影響本來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 %> ``` 可以達成一樣的效果。  ## 參考資料 [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 permlink | cn |
| permlink | formbuilder |
| title | # 使用FormBuilder自定義你的表單 |
| Transaction Info | Block #22971417/Trx 23c989e650e90825f3cd2f7a950f49cf2ad17359 |
View Raw JSON Data
{
"block": 22971417,
"op": [
"comment",
{
"author": "linjiahung",
"body": "\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\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\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\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-params2018/06/01 13:47:48
linjiahungpublished a new post: rails-rails-params
2018/06/01 13:47:48
| author | linjiahung |
| 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 permlink | cn |
| permlink | rails-rails-params |
| title | [Rails]如何使用Rails中的params |
| Transaction Info | Block #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-model2018/06/01 13:40:54
linjiahungpublished a new post: rails-model
2018/06/01 13:40:54
| author | linjiahung |
| body |  一般來說,將資料存入資料庫前,為了確保資料的有效性,通常都會透過驗證來確保只有有效的資料才能存入資料庫。 雖然前端通常也會透過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 permlink | cn |
| permlink | rails-model |
| title | [Rails]Model驗證中常見的重要觀念 |
| Transaction Info | Block #22942265/Trx b72b4d50a14aa3ae271da0f50b365506e3422bd4 |
View Raw JSON Data
{
"block": 22942265,
"op": [
"comment",
{
"author": "linjiahung",
"body": "\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
}linjiahungfollowed @nolla2018/06/01 12:06:27
linjiahungfollowed @nolla
2018/06/01 12:06:27
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"nolla","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @ghadir2018/06/01 12:06:15
linjiahungfollowed @ghadir
2018/06/01 12:06:15
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"ghadir","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @happo2018/06/01 12:06:12
linjiahungfollowed @happo
2018/06/01 12:06:12
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"happo","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @greel2018/06/01 12:06:06
linjiahungfollowed @greel
2018/06/01 12:06:06
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"greel","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @igora2018/06/01 12:06:03
linjiahungfollowed @igora
2018/06/01 12:06:03
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"igora","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @hesamali2018/06/01 12:05:57
linjiahungfollowed @hesamali
2018/06/01 12:05:57
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"hesamali","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @jacobe2018/06/01 12:05:51
linjiahungfollowed @jacobe
2018/06/01 12:05:51
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"jacobe","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @jasmeen2018/06/01 12:05:45
linjiahungfollowed @jasmeen
2018/06/01 12:05:45
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"jasmeen","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @jommo2018/06/01 12:05:36
linjiahungfollowed @jommo
2018/06/01 12:05:36
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"jommo","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @katee2018/06/01 12:05:33
linjiahungfollowed @katee
2018/06/01 12:05:33
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"katee","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @kimwoo2018/06/01 12:05:18
linjiahungfollowed @kimwoo
2018/06/01 12:05:18
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"kimwoo","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @koobix2018/06/01 12:05:15
linjiahungfollowed @koobix
2018/06/01 12:05:15
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"koobix","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @koolis2018/06/01 12:05:03
linjiahungfollowed @koolis
2018/06/01 12:05:03
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"koolis","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @ladano2018/06/01 12:04:54
linjiahungfollowed @ladano
2018/06/01 12:04:54
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"ladano","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @larison2018/06/01 12:04:48
linjiahungfollowed @larison
2018/06/01 12:04:48
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"larison","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @larix2018/06/01 12:04:24
linjiahungfollowed @larix
2018/06/01 12:04:24
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"larix","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @lenzy2018/06/01 12:04:09
linjiahungfollowed @lenzy
2018/06/01 12:04:09
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"lenzy","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @letibia802018/06/01 12:04:03
linjiahungfollowed @letibia80
2018/06/01 12:04:03
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"letibia80","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @lomo2018/06/01 12:04:00
linjiahungfollowed @lomo
2018/06/01 12:04:00
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"lomo","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @livo2018/06/01 12:03:51
linjiahungfollowed @livo
2018/06/01 12:03:51
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"livo","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}rivalhwupvoted (11.00%) @linjiahung / rails-rails-params2018/05/31 15:39:36
rivalhwupvoted (11.00%) @linjiahung / rails-rails-params
2018/05/31 15:39:36
| author | linjiahung |
| permlink | rails-rails-params |
| voter | rivalhw |
| weight | 1100 (11.00%) |
| Transaction Info | Block #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 @linjiahung2018/05/31 15:30:09
steemdelegated 15.176 SP to @linjiahung
2018/05/31 15:30:09
| delegatee | linjiahung |
| delegator | steem |
| vesting shares | 24679.428581 VESTS |
| Transaction Info | Block #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
}linjiahungupvoted (100.00%) @tensaix2j / ruby-transfer2018/05/31 14:58:06
linjiahungupvoted (100.00%) @tensaix2j / ruby-transfer
2018/05/31 14:58:06
| author | tensaix2j |
| permlink | ruby-transfer |
| voter | linjiahung |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}linjiahungfollowed @elik2018/05/31 14:57:15
linjiahungfollowed @elik
2018/05/31 14:57:15
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"elik","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @faridline2018/05/31 14:57:09
linjiahungfollowed @faridline
2018/05/31 14:57:09
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"faridline","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @adran2018/05/31 14:57:06
linjiahungfollowed @adran
2018/05/31 14:57:06
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"adran","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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 SP2018/05/31 14:54:45
linjiahungclaimed reward balance: 0.004 STEEM, 0.199 SBD, 0.120 SP
2018/05/31 14:54:45
| account | linjiahung |
| reward sbd | 0.199 SBD |
| reward steem | 0.004 STEEM |
| reward vests | 195.672540 VESTS |
| Transaction Info | Block #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
}coldhairupvoted (4.00%) @linjiahung / rails-rails-render-12018/05/31 10:56:51
coldhairupvoted (4.00%) @linjiahung / rails-rails-render-1
2018/05/31 10:56:51
| author | linjiahung |
| permlink | rails-rails-render-1 |
| voter | coldhair |
| weight | 400 (4.00%) |
| Transaction Info | Block #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
}linjiahungfollowed @nadsteem2018/05/31 06:28:57
linjiahungfollowed @nadsteem
2018/05/31 06:28:57
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"nadsteem","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}linjiahungfollowed @hr12018/05/31 06:28:33
linjiahungfollowed @hr1
2018/05/31 06:28:33
| id | follow |
| json | ["follow",{"follower":"linjiahung","following":"hr1","what":["blog"]}] |
| required auths | [] |
| required posting auths | ["linjiahung"] |
| Transaction Info | Block #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
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress49.77%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779073152
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779073152
},
"rc_account": {
"account": "linjiahung",
"max_rc": "10164408779",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779073152
}
}
}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.
[]