2014-11-16 3 views
0

:article 모델에 속하는 :vote 모델에 레코드를 추가하는 양식을 만들었습니다. 아래에서 볼 수 있듯이 :vote 레코드를 만드는 양식은 :article보기입니다. 이 모델에 중첩 된 경로를 사용하지 않으므로 form_for 도우미를 사용하는 대신 일반 form_tags을 사용하고 있습니다. 내 문제는 strong_parameters이 숨겨진 필드를 허용하지 않는다는 것입니다.강력한 매개 변수가 내 매개 변수를 인식하지 못합니다.

<p id="notice"><%= notice %></p> 

<p> 
<strong>Title:</strong> 
<%= @article.title %> 
</p> 

<p> 
<strong>Body:</strong> 
<%= @article.body %> 
</p> 

<p> 
<strong>User:</strong> 
<%= @article.user_id %> 
</p> 

<%= form_tag("/vote/#{@article.id}", method: :post) do -%> 
<%= hidden_field_tag 'vote[value]', 1 %> 
<%= submit_tag 'Up vote' %> 
<% end -%> 

<%= link_to 'Edit', edit_article_path(@article) %> 
<%= link_to 'Back', articles_path %> 

당신이 컨트롤러 코드에서 볼 수 있듯이, 내가 가진 흰색은 PARAM 및 로그 데이터는 포스트 몸이 매개 변수 해시에 대한 올바른 형식으로 들어오는 보여 나열하지만, ​​내 생성 작용에 도달하지 않습니다.

class VotesController < ApplicationController 

def create 
    @article = Article.find(params[:id]) 
    @vote = Vote.new(params[:strong_vote]) 
    @vote.user_id = current_user.id 
    @vote.article_id = @article.id 
    @vote.save 
    redirect_to @article 

end 


private 

def strong_vote 
    params.require(:vote).permit(:value) 
end 


end 

    Processing by VotesController#create as HTML Parameters:{"utf8"=>"✓","authenticity_token"=>"Y6eBxpwGXGdT2toeUrxAlLW58Hj8Eux+SvoWeVUoYa8=","vote"=>{"value"=>"1"}, "commit"=>"Up vote","id"=>"7"} 
    Article Load (0.1ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT 1 [["id", 7]] 
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE"users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1 
    Rendered text template (0.0ms) 
    Completed 200 OK in 7ms (Views: 1.0ms | ActiveRecord: 0.4ms) 

다음은 내 경로입니다. 도움이 될 수 있습니다.

devise_for :users 
root 'articles#index' 

resources :articles 

post '/vote/:id' => 'votes#create' 

업데이트 : 당신의 응답 doz87을 시도했지만 나는 다음과 같은 오류 얻을 : 당신이 새로운 투표 아무것도 지정하지 때문에

ArgumentError in VotesController#create 
When assigning attributes, you must pass a hash as an argument. 

Extracted source (around line #5): 
3 
4 
5 
6 
7 
8 

    def create 
     @article = Article.find(params[:id]) 
     @vote = Vote.new(:strong_vote) 
     @vote.user_id = current_user.id 
     @vote.article_id = @article.id 
     @vote.save 

Rails.root: /home/w/Folders/playground/ruby/voter 

Application Trace | Framework Trace | Full Trace 
app/controllers/votes_controller.rb:5:in `create' 
Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"AVKHgcsOwQhwWJGfSGQhIL1Lbr7yhSRaGKTrxuLcAuo=", 
"vote"=>{"value"=>"1"}, 
"commit"=>"Up vote", 
"id"=>"7"} 
+0

예, 해시가 필요한 Vote.new 문에 기호로 전달합니다. 콜론없이 strong_vote를 사용한 경우 컨트롤러에 정의한 매개 변수 해시를 전달합니다. – doz87

답변

1

이 작동하지 않는 이유는입니다. PARAMS [: strong_vote]

@vote = Vote.new(params[:strong_vote]) 

당신은 이런 식으로 작성해야 존재하지 않습니다

@vote = Vote.new(strong_vote) 

또한 그것이 저장 실패에서 오류를 잡을 수있는 좋은 연습입니다. 뭔가 잘못되면 if 블록에 @ vote.save를 래핑해야합니다.

if @vote.save 
redirect_to @article 
else 
flash.now[:notice] = "Something went wrong while saving" 
render 'new' 
end 
+0

사실 .. 몇 가지 매우 이상한 이유 .. 강력한 매개 변수 함수를 삭제하고 다시 작성하면 효과가 있었지만 정확하게 쓰여졌습니다 .... 오 잘 고마워요 @ doz87 – walt