2017-05-19 7 views
0

레일 튜토리얼을 따라 사용자가 리뷰를 제출할 수있는 장소의 디렉토리 웹 사이트를 만들어야합니다.리뷰를 장소 레일 웹 사이트 앱에 제출할 수 없음

은 지금, 여기에 일이 : 내가 사용자를 등록 할 수 있습니다

내가 로그인 할 수 있어요. 일단 로그인하면 데이터베이스에 새 장소를 만들 수 있습니다. 또한 내가 만든 각 장소의 웹 페이지에 액세스 할 수 있습니다.

그래도 문제가 있습니다. 각 장소 페이지에서 장소 리뷰를 제출할 수 없습니다.

모든 장소에는 주소, 전화 번호, 웹 사이트, 설명 및 해당 위치가있는지도가 있습니다. 그 같은 페이지에서 리뷰를 제출할 양식이 있지만 리뷰 작성 버튼을 클릭하면 아무 일도 일어나지 않습니다. 페이지에서 리뷰를 볼 수 없으며 레일 콘솔로 이동할 때 단 하나의 리뷰가 생성되지 않았 음을 분명히 알 수 있습니다. 이 코드를 내 응용 프로그램 /보기/리뷰/_review.html.erb 내부

<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 %> 

: 내 응용 프로그램 /보기/리뷰/_form.html.erb 내부

이 코드를 가지고 :

<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> 
: 내 응용 프로그램/뷰/장소/show.html.erb 내부

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

이 코드를 내 places_controller.rb에

내가 가진 :

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 

또한, 지금까지 ... 여기 내 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 

내가 저장할 수없는 이유의 어떤 통찰력 장소 리뷰?

+0

'@ place_id '는 어디에 정의되어 있습니까? –

+0

험, 내가 잘 모르겠지만 전화. 질문을 업데이트하려면 무엇이 유용할까요? 장소 컨트롤러? 지역 정보보기? – samureira

+0

제 말은,'_form.html.erb'가'places # show' 내에 렌더링되었지만 당신의 show 메소드가'@ reviews'와'@ review' 만 가지고 있다면 말입니다. –

답변

1

양식은 양식은 다음과 같이해야한다 : - 당신은 컨트롤러의 예 변수 @place을 설정하는

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

. 따라서 렌더링 된 뷰에서 @ place.id를 사용해야합니다. 어디서나 @place_id를 설정하지 않았습니다.