Я создал форму, чтобы добавить запись в :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"}
Да, вы передаете символ Vote.new, требующий хеша. Если вы использовали strong_vote без двоеточия, то вы передаете хэш х параметра, который вы определили в контроллере. – doz87