Un mot qui a marqué M. Mentor ~ Il y a une différence de niveau pour pouvoir écrire des Rails. ~ ~ RSpec est une technologie indispensable. ~
example.html.haml
<div class="haml">
<h1>Hello Haml!</h1>
</div>
.haml
%h1 Hello Haml!
routes.rb
#Post est le parent, et Comment et Like sont les enfants.
resources :posts do
resources :comments, only: [:create, :destroy]
resources :likes, only: [:show,:create, :destroy]
end
De plus, vous pouvez apporter deux identifiants à partir de l'URL! ↓
post_comments POST /posts/:post_id/comments(.:format) comments#create
post_comment DELETE /posts/:post_id/comments/:id(.:format) comments#destroy
post_likes POST /posts/:post_id/likes(.:format) likes#create
post_like GET /posts/:post_id/likes/:id(.:format) likes#show
DELETE /posts/:post_id/likes/:id(.:format) likes#destroy
#C'est difficile à comprendre, alors faisons-le encore plus
Faire de la logique utilisée plusieurs fois une méthode modèle, la rendre sèche ↓ p>
example.html.haml
- - if current_user.id == post.user_id #J'avais un mauvais visage quand je l'ai écrit directement
+ - post.created_user?(current_user)
%p vous êtes la personne qui a publié
post.rb
#Définir la méthode du modèle
def created_user?(user)
self.user_id == user.id
end
L'appel d'une méthode directement à partir du modèle dans le contrôleur peut facilement conduire à une faille de sécurité. Fondamentalement, l'ensemble de la cible est irrégulier, et il est presque inexistant. ↓ p>
example_controller.rb
def new
- @post = Post.new #Un mauvais identifiant peut être entré
+ @post = current_user.posts.build #current_gamme d'utilisateurs(portée)
end
#Si vous voulez vraiment utiliser le modèle du capital, vous devez le faire ou mettre votre main sur votre poitrine avant de vous décider.
Faites de la partie commune du contrôleur une méthode privée et conservez-la dans DRY avec before_action ↓ p>
example_controller.rb
before_action :set_post
#réduction
private
def set_post
@post = current_user.posts.find(params[:id])
end
#Ne grossissez pas le contrôleur, faisons-le mince
Pour des méthodes de sauvegarde et de destruction qui n'échouent presque jamais, à l'exception de facteurs tels que des problèmes de serveur dans l'environnement Internet! ↓ p>
example_controller.rb
def destroy
@post.destroy!
flash[:notice] = "Message supprimé"
redirect_to posts_path
end
Faites-en une constante pour qu'elle soit facile à comprendre pour toute la personne. Définissez une constante dans le modèle et appelez-la dans le contrôleur. ↓ p>
example_controller.rb
#ex_model.rb
PER_COMMENT = 5
#example_controller.rb
@comments = @post.comments.page(params[:page]).per(Ex_model::PER_COMMENT).order(created_at: :desc)
#Nom du modèle::Nom constant
À l'origine, écrire un test et écrire une méthode tout en vérifiant les échecs (TDD, développement piloté par les tests) p>
post_spec.rb
describe "#created_user?" do
let(:user) { FactoryBot.create(:user) } #La personne
let(:other_user) { FactoryBot.create(:user) } #autres
let(:post) { FactoryBot.create(:post, user: user) } #Publié par la personne
context "Pour le même utilisateur que l'utilisateur connecté" do
it "Revenir vrai" do
expect(post.created_user?(user)).to eq true
end
end
context "Si ce n'est pas le même utilisateur que l'utilisateur connecté" do
it "Retour faux" do
expect(post.created_user?(other_user)).to eq false
end
end
end
Recommended Posts