2017-05-19 1 views
0

Je suis un tutoriel Rails où je dois créer un site Web d'annuaire des endroits dans lesquels un utilisateur peut soumettre une critique.Impossible de soumettre une évaluation dans un site - Rails Directory Site Web de l'application

En ce moment, voici la chose:

Je peux enregistrer un utilisateur et je suis capable de se connecter. Une fois connecté, je peux également créer un nouvel emplacement dans la base de données. Je peux également accéder à la page Web de chaque lieu que j'ai créé.

J'ai un problème cependant. Sur chaque page de lieu, je ne peux pas soumettre la revue de l'endroit.

Tous les lieux ont une adresse, un numéro de téléphone, un site web, une description et une carte avec l'emplacement de ce lieu. Sur cette même page, j'ai un formulaire pour soumettre un avis, cependant, une fois que je clique sur le bouton créer un commentaire, rien ne se passe. Je ne peux pas voir l'avis sur la page et quand je vais à la console des rails, je peux vraiment voir qu'il n'y a pas un seul commentaire créé.

intérieur de mon app/views/critiques/_form.html.erb je ce code:

<div class="form-inputs"> 
    <%= f.input :content, required: true %> 
    <%= f.hidden_field :place_id, required: true, value: @place_id %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

intérieur de mon app/views/critiques/_review.html.erb J'ai ce code:

<p> 
    <%= gravatar_tag review.user.email, size: 20 %><%= review.content %> by <%= review.user.name %> 
</p> 

intérieur de mon app/views/lieux/show.html.erb J'ai ce code:

<div class="row"> 
    <div class="col-md-3"> 
    <h3><%= @place.name %></h3> 
    <p><strong>Adress</strong><%= @place.address %></p> 
    <p><strong>Phone</strong><%= @place.phone %></p> 
    <p><strong>Website</strong><%= @place.website %></p> 
    <p><strong>Description</strong><%= @place.description %></p> 
    <div id="map-canvas" style = "width:230px; height:230px"></div> 
    </div> 

    <div class="col-md-9"> 
    <h3>Reviews by People</h3> 
    <% if current_user %> 
    <h5>New Review</h5> 
    <%= render 'reviews/form' %> 
    <h5>All Reviews</h5> 
    <%= render @reviews %> 
    <% end %> 
    </div> 

</div> 

Sur mon places_controller.rb je:

class PlacesController < ApplicationController 
    before_action :authenticate_user!, only: [:new, :edit, :create, :update, :destroy] 
    before_action :set_place, only: [:show, :edit, :update, :destroy] 

    # GET /places 
    # GET /places.json 
    def index 
    @places = Place.all 
    end 

    # GET /places/1 
    # GET /places/1.json 
    def show 
    @reviews = @place.reviews 
    @review = Review.new 
    end 

    # GET /places/new 
    def new 
    @place = Place.new 
    end 

    # GET /places/1/edit 
    def edit 
    end 

    # POST /places 
    # POST /places.json 
    def create 
    @place = current_user.places.new(place_params) 

    respond_to do |format| 
     if @place.save 
     format.html { redirect_to @place, notice: 'Place was successfully created.' } 
     format.json { render :show, status: :created, location: @place } 
     else 
     format.html { render :new } 
     format.json { render json: @place.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /places/1 
    # PATCH/PUT /places/1.json 
    def update 
    respond_to do |format| 
     if @place.update(place_params) 
     format.html { redirect_to @place, notice: 'Place was successfully updated.' } 
     format.json { render :show, status: :ok, location: @place } 
     else 
     format.html { render :edit } 
     format.json { render json: @place.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /places/1 
    # DELETE /places/1.json 
    def destroy 
    @place.destroy 
    respond_to do |format| 
     format.html { redirect_to places_url, notice: 'Place was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_place 
     @place = Place.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def place_params 
     params.require(:place).permit(:name, :address, :description, :phone, :website) 
    end 
end 

En outre, jusqu'à présent ... voici mon code reviews.controller.rb:

class ReviewsController <ApplicationController 

    before_action :authenticate_user! 
    before_action :set_review, only: [:edit, :update, :destroy] 

    def edit 
    end 

    def create 
    @review = current_user.reviews.new(review_params) 

    respond_to do |format| 
     if @review.save 
     format.html { redirect_to place_path(@review.place) , notice: 'Review was successfully created.' } 
     else 
     format.html { render :new } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @review.update(review_params) 
     format.html { redirect_to place_path(@review.place), notice: 'Review was successfully updated.' } 
     else 
     format.html { render :edit } 
     end 
    end 
    end 


    def destroy 
    @review.destroy 
    respond_to do |format| 
     format.html { redirect_to place_path(@review.place), notice: 'Review was successfully destroyed.' } 
    end 
    end 

    private 

    def set_review 
    @review = Review.find(params[:id]) 
    end 

    def review_params 
    params.require(:review).permit(:content, :place_id) 
    end 


end 

Toute idée des raisons pour lesquelles je ne peux pas sauver avis d'un lieu?

+0

Où '@ place_id' est-il défini? –

+0

Humm, mais appelez comme je ne suis pas sûr. Qu'est-ce qui serait utile pour moi de mettre à jour la question? Contrôleur de lieux? Vue des lieux? – samureira

+0

Je veux dire, si '_form.html.erb' est rendu dans le' lieux # show', mais votre méthode show a seulement '@ reviews' et' @ review'. –

Répondre

1

Votre formulaire doit être votre formulaire comme celui-ci: -

<div class="form-inputs"> 
    <%= f.input :content, required: true %> 
    <%= f.hidden_field :place_id, required: true, value: @place.id %> 
</div> 

Vous définissez par exemple @place variables dans le contrôleur. Vous devez donc utiliser @ place.id dans vos vues rendues. Vous n'avez défini @place_id nulle part