मुख्य सामग्री पर जाएँ

Actions

यह पृष्ठ अंग्रेज़ी से अनुवादित है। अंग्रेज़ी पृष्ठ पढ़ें

action सर्वर कोड है जिसे कोई Screen, ग्रिड, फ़ॉर्म, कमांड, JSON API या एजेंट कॉल कर सकता है। #[action] घोषित करता है कि इसे कौन कॉल कर सकता है; फ्रेमवर्क कोड चलने से पहले यह जाँचता है।

action घोषित करना

#[action(permission = "stock.product.read")]
pub async fn search_products(q: DataQuery, store: ProductStore) -> Result<Page<Product>> {
    Ok(q.apply(store.all()?))
}

#[action(permission = "stock.product.write", audit)]
pub async fn save_product(product: Valid<Product>, store: ProductStore) -> Result<Product> {
    store.save(product.into_inner())
}
  • पहला आर्ग्युमेंट इनपुट है। यह क्लाइंट से आता है, इसलिए फ्रेमवर्क इसे अविश्वसनीय JSON की तरह पढ़ता है।
  • बाकी हर आर्ग्युमेंट इंजेक्ट होता है: Ctx या कोई पंजीकृत Service।
  • रिटर्न टाइप Result<T> है।

एक्सेस

हर action ठीक इनमें से एक घोषित करती है:

विकल्पअर्थ
permission = "feature.resource.verb"आइडेंटिटी को यह अनुमति चाहिए
publicकोई भी, उनमें वे उपयोगकर्ता भी जिन्होंने साइन इन नहीं किया

बिना एक्सेस वाली action कंपाइल नहीं होती। अनुमति के नाम छोटे अक्षरों में और बिंदु से जुड़े होते हैं, जैसे sales.order.write।

अन्य विकल्प:

विकल्पअर्थ
auditहर कॉल के लिए ऑडिट रिकॉर्ड लिखता है
reauthउपयोगकर्ता ने हाल में साइन इन किया होना चाहिए (App::reauth_within)

त्रुटियाँ

त्रुटिस्टेटसउपयोग
Error::NotFound404रिकॉर्ड मौजूद नहीं है या उपयोगकर्ता को उसके होने का पता नहीं होना चाहिए
Error::Forbidden403एक्सेस अस्वीकृत
Error::Denied(t!("..."))403उपयोगकर्ता के पढ़ने लायक कारण के साथ अस्वीकृत
Error::Conflict409फ़ॉर्म लोड होने के बाद पंक्ति संस्करण बदल गया
Error::Validation(errors)422फ़ील्ड त्रुटियाँ, फ़ील्ड के पास दिखाई जाती हैं
Error::Internal("detail")500विवरण केवल सर्वर लॉग में जाता है

कोड से फ़ील्ड त्रुटि:

let mut errors = ValidationErrors::default();
errors.add(Product::code, t!("stock.code_taken", code = product.code));
return Err(errors.into());

सूचियाँ

सूचियाँ DataQuery लेती हैं और Page<M> लौटाती हैं। सूची action कभी हर पंक्ति नहीं लौटाती; ग्रिड पृष्ठ माँगता है, और क्लाइंट कुछ भी भेजे, सर्वर पृष्ठ का आकार सीमित रखता है।

कॉन्टेक्स्ट

Ctx अनुरोध है: ctx.identity(), ctx.locale(), ctx.time_zone(), ctx.now(), ctx.today(), ctx.tenant(), ctx.license(), ctx.config(), ctx.theme() और ctx.t(&text)। सिस्टम घड़ी के बजाय ctx.now() और ctx.today() इस्तेमाल करें, ताकि टेस्ट App::fixed_now से समय तय कर सकें।

action कहाँ इस्तेमाल होती हैं

  • DataGrid::of(action) पंक्तियाँ लोड करती है; .edit_with(action), .row_action(...) और .bulk_action(...) उन्हें बदलती हैं।
  • Form::submit(label, action) फ़ॉर्म सहेजती है।
  • ActionButton::new(label, action, input) बटन से action चलाती है।
  • Command::action(...) कमांड पैलेट या शॉर्टकट से एक चलाती है।
  • Feature::api(action) उसे JSON के रूप में प्रकाशित करती है (देखें API और OpenAPI)।
  • Feature::search(action) कमांड पैलेट में सर्वर खोज जोड़ती है।

हर रास्ता वही जाँचें चलाता है: ब्राउज़र कॉल के लिए CSRF, feature के गार्ड, action का एक्सेस, फिर इंटरसेप्टर।