2013-02-10 4 views
3

레일스에 대한 최소한의 이해와 모델 전체에서 변수를 사용하는 방법 때문에 오류가 발생할 가능성이 있습니다. 따라서 더 많은 코드가 필요하거나 내 용어가 정확하지 않은 경우 저도 알고 있고 기꺼이 질문을 업데이트 할 것입니다.인스턴스 변수를 양식에 전달하기 - 레일

나는 사용자가 "좋아할"수있는 게시물을 제공합니다. 다음 코드는 개별 게시물의 페이지 (예 : site.com:3000/posts/*post.id*)에서 양식 데이터가 like[liked_post_id]:*post.id*이고, 프로필 (예 : site.com:3000/users/*user.id*)과 같은 양식을 제출하려고 시도 할 때 좋아요. 양식 데이터는 전달됩니다. like[liked_post_id]: (공백 값)

게시물의 피드에서 liked_post_id 변수에 _like.html.erb의 게시물 ID를 전달하려면 어떻게해야합니까?

같은 양식의 동작이 전체적으로 /likes 인 것을 확인했습니다. 이것은 페이지에있을 때만 작동합니까 site.com:3000/posts/*post.id*? 적절한 형태로

#views/posts/_post.html.erb: 
... 
    <%= render 'posts/like_form' if signed_in? %> 
... 

경로 : 나는 형태의 작업이 /posts/*post.id*/likes을 수 있도록 당신이 내 게시물보기에서 페이지 site.com:3000/users/*user.id*

에있을 때 그것을 수정해야하는지 궁금 해요

#views/posts/_like_form.html.erb: 
    <div id="like_form"> 
    <% if current_user.likes_this?(@post) %> 
    <%= render "posts/unlike" %> 
    <% else %> 
    <%= render "posts/like" %> 
    <% end %> 
    </div> 

등에서 :

#views/posts/_like.html.erb 
    <%= form_for Like.new, :remote => true do |f| %> 
    <%= f.hidden_field :liked_post_id, :value => @post.id %> 
    <%= f.submit "Like" %> 
    <% end %> 

프로파일에서 (피드 게시물) :

#views/users/show.html.erb 
... 
    <%= render @posts %> 
... 

컨트롤러 추천했습니다 :

#controllers/likes_controller.rb  
    class LikesController < ApplicationController 
    before_filter :signed_in_user 

    def create 
    @post = Post.find(params[:like][:liked_post_id]) 
    current_user.like!(@post) 
    respond_to do |format| 
     format.html { redirect_to root_url } 
     format.js 
    end 
    end 
... 

사용자 모델 :

#models/user.rb 
... 
    def like!(post) 
    likes.create!(liked_post_id: post.id) 
    end 
... 

솔직한-눈보라 @ 내 폼 마크 업이 문제가 있다고 지적했다. 게시물의 페이지에서 생성 된 태그는 다음과 같습니다

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" value="73" /> 

공급 페이지에있는 동안 :

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" /> 
+0

_likes_의 생성은 컨트롤러에서 수행해야합니다. –

+0

@ Code-Source, 위의 "Edit 1 :"참조, 같은 컨트롤러에 _like_가 생성됩니다. –

답변

8

당신은이 같은 작업을 수행 할 수 있습니다

<% form_for Like.new, :remote => true do |f| %> 
<%= f.hidden_field :post_id, :value => @post.id %> 
<%= f.submit %> 
<% end %> 

current_user.likes.build(...) 부분은 나가야 보기 및 컨트롤러 내부. current_user.like! 메서드를 사용하고 있으므로 사용자 모델에서 이미 구현 한 메서드를 구현 한 것 같습니다. 당신이 params[:like]에 액세스 할 수있는 LikesController의 create 액션에서 좋아하지 않으면 빌드하십시오.

def create 
    @post = Post.find(params[:like][:post_id]) 
    current_user.likes.build(@post) 
    # ... 
    end 

편집

당신과 같이 당신의 _like_form의 파셜에 제대로 @post 변수를 전달해야 할 수 있습니다

:

#views/posts/_post.html.erb: 
... 
<% if signed_in? %> 
    <%= render 'posts/like_form', :post => @post %> 
<% end %> 
... 

이 당신이 내부 post 변수에 acceess 줄 것이다 partial을 사용하여 폼 값을 ID로 미리 채울 수 있습니다. 이 질문을 Pass a variable into a partial, rails 3?으로보고 변수를 부분 변수에 올바르게 전달하는 방법을 읽어보십시오. <%= debug <variablename> %>

+0

Ruby 모범 사례와 좋아하는 건물 위치에 대한 몇 가지 문제를 지적 해 주셔서 감사합니다. 이것들은 레일을 배우는 동안 계속 지키고있는 주제입니다. 내 질문을 "Edit 2"와 함께 업데이트했습니다. 방법. 불행히도 저는 개별 게시물의 페이지에 대해서만 좋아요를 제출할 수 있습니다. 게시물 피드가있는 프로필에서는 "좋아하는 [좋아하는 포스트 _ ID]"와 같은 양식 데이터에 공백 값이 전송됩니다. –

+1

처럼 보이게됩니다. 게시물 변수를 _like_form 또는 _like에 올바르게 전달하지 마십시오. <% = debug @ post %>를 사용하여 post 변수를 검사하십시오. 또한 숨겨진 필드 안에 값이있는 경우 양식 마크 업을 검사하십시오. – tmaximini

+0

양식 마크 업은 정확한 문제입니다. 게시물의 페이지에서 :'' 피드 페이지에서 :' ' 어디에서 포스트 변수를 수정할 수 있습니까? –

관련 문제