Katakanlah saya punya Model Rails yang disebut Thing. Hal ini memiliki atribut url yang secara opsional dapat diatur ke URL di suatu tempat di Internet. Dalam kode tampilan, saya perlu logika yang melakukan hal berikut:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Logika kondisional dalam tampilan ini jelek. Tentu saja, saya bisa membangun fungsi pembantu, yang akan mengubah pandangan menjadi ini:
<%= thing_link('Text', thing) %>
Itu memecahkan masalah verbosity, tapi saya benar-benar lebih suka memiliki fungsi dalam model itu sendiri. Dalam hal ini, kode tampilan adalah:
<%= link_to('Text', thing.link) %>
Ini jelas membutuhkan metode tautan pada model. Inilah yang perlu dikandungnya:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Pada titik pertanyaan, thing_path () adalah metode yang tidak didefinisikan di dalam kode Model. Saya berasumsi bahwa mungkin untuk "menarik" beberapa metode pembantu ke dalam model, tetapi bagaimana caranya? Dan apakah ada alasan nyata bahwa perutean hanya beroperasi pada pengontrol dan melihat lapisan aplikasi? Saya dapat memikirkan banyak kasus di mana kode model mungkin perlu berurusan dengan URL (berintegrasi dengan sistem eksternal, dll).
sumber
Jawaban:
Di Rails 3, 4, dan 5 Anda dapat menggunakan:
misalnya
sumber
:host
opsi Anda di mana-mana dan mengaturnya sekali di file konfigurasi lingkungan Anda:Rails.application.routes.default_url_options[:host] = 'localhost:3000'
include Rails.application.routes.url_helpers
bekerja untuk saya di Rails 4.1Saya telah menemukan jawaban mengenai bagaimana melakukan ini sendiri. Di dalam kode model, cukup cantumkan:
Untuk Rails <= 2:
Untuk Rails 3:
Ini secara ajaib
thing_path(self)
mengembalikan URL untuk hal saat ini, atauother_model_path(self.association_to_other_model)
mengembalikan beberapa URL lainnya.sumber
include Rails.application.routes.url_helpers
Anda juga dapat menemukan pembersih pendekatan berikut daripada memasukkan setiap metode:
sumber
undefined local variable or method 'url_helpers' for Event:Class
kesalahan ... :(undefined method url_helpers
. Apa yang akan saya lakukan?class
, seperti yang ditunjukkan dalam jawaban. Jika kelas Model Anda sudah diperluas,< ApplicationRecord
ini tidak akan berhasil?Logika apa pun yang berkaitan dengan apa yang ditampilkan dalam tampilan harus didelegasikan ke metode penolong, karena metode dalam model ini semata-mata untuk menangani data.
Inilah yang dapat Anda lakukan:
sumber
Saya sangat suka mengikuti solusi bersih.
Ini dari http://hawkins.io/2012/03/generating_urls_whenever_and_wherever_you_want/
sumber
Meskipun mungkin ada cara saya cenderung menjaga logika seperti itu dari Model. Saya setuju bahwa Anda tidak harus menempatkan itu dalam tampilan ( tetap kurus ) tetapi kecuali model mengembalikan url sebagai sepotong data ke controller, hal-hal routing harus berada di controller.
sumber
(Sunting: Lupakan ocehan saya sebelumnya ...)
Ok, mungkin ada situasi di mana Anda akan pergi ke model atau ke url lain ... Tapi saya tidak benar-benar berpikir ini termasuk dalam model, tampilan (atau mungkin model) terdengar lebih tepat.
Tentang rute, sejauh yang saya tahu rute adalah untuk tindakan dalam pengontrol (yang biasanya "ajaib" menggunakan tampilan), tidak langsung ke tampilan. Pengontrol harus menangani semua permintaan, tampilan harus menyajikan hasil dan model harus menangani data dan menyajikannya ke tampilan atau pengontrol. Saya sudah mendengar banyak orang di sini berbicara tentang rute ke model (ke titik saya paling mulai percaya itu), tetapi seperti yang saya mengerti: rute pergi ke controller. Tentu saja banyak pengontrol adalah pengontrol untuk satu model dan sering disebut
<modelname>sController
(mis. "UsersController" adalah pengontrol model "User").Jika Anda mendapati diri Anda menulis sejumlah logika yang tidak menyenangkan dalam sebuah tampilan, cobalah untuk memindahkan logika tersebut ke tempat yang lebih tepat; permintaan dan logika komunikasi internal mungkin termasuk dalam pengontrol, logika terkait data dapat ditempatkan dalam model (tetapi tidak menampilkan logika, yang mencakup tag tautan dll.) dan logika yang murni terkait tampilan akan ditempatkan dalam helper.
sumber