2014-11-16 3 views
0

Я создал форму, чтобы добавить запись в :vote модель, которая принадлежит модели :article. Как вы можете видеть ниже, форма для создания записи :vote находится в виде :article. Не используя вложенные маршруты для этих моделей, поэтому вместо использования помощника form_for я использую простой form_tags. Моя проблема в том, что strong_parameters не разрешает мое скрытое поле.Rails сильные параметры, не распознающие мои параметры

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

Как вы можете видеть в коде контроллера, у меня есть белый перечислила параметр может быть и каротажные данные показывают, что после прихода тела в нужном формате для хэш параметров, но она не достигнет моего создания действия.

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) 

Кроме того, это хорошая практика, чтобы поймать любые ошибки из неудачного сохранения. Вы должны обернуть @ vote.save в блоке if, если что-то пойдет не так.

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

На самом деле .. по какой-то очень странной причине .. Я удалил сильную функцию param и переписал, и это сработало ... но его написано точно так же .... oh well Спасибо @ doz87 – walt

Смежные вопросы