Передача идентификатора через скрытое поле формы - PullRequest
0 голосов
/ 04 января 2019

Я пытался сделать что-то похожее на это в форме, но получаю эту ошибку:

Started POST "/opinions" for 127.0.0.1 at 2019-01-03 17:11:12 -0800
Processing by OpinionsController#create as JS
  Parameters: {"utf8"=>"✓", "opinion"=>{"content"=>"This is an opinion"}, "type_of"=>"pro", "topicId"=>"{:value=>2}", "commit"=>"Create Opinion"}
  User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  Topic Load (0.0ms)  SELECT  "topics".* FROM "topics" WHERE "topics"."id" = ? LIMIT ?  [["id", nil], ["LIMIT", 1]]
Completed 404 Not Found in 3ms (ActiveRecord: 0.0ms)



ActiveRecord::RecordNotFound (Couldn't find Topic with 'id'=):

app/controllers/opinions_controller.rb:6:in `create'

мнения_form.html.erb:

<%= form_for(opinion, :html=> {class:"form-horizontal", role:"form"}, remote: true) do |f| %>
  <div class="form-group">
    <div class="col-sm-12">
      <%= f.text_area :content, rows:4, class: "form-control", placeholder: "Opinion" %>
    </div>
  </div>
  <%= hidden_field_tag 'type_of', typeOf %>
  <%= hidden_field_tag :topicId, :value => @topic.id %>
  <% puts "ID: " + @topic.id.to_s %>
  <div class="form-group">
    <div class="col-sm-12">
      <%= f.submit %>
    </div>
  </div>
<% end %>

Соответствующий код в контроллере:

def create
  @opinion = Opinion.new(opinion_params)

  @opinion.user = current_user
  @opinion.topic = Topic.find(params[:opinion][:topicId])
  if @opinion.save
    flash[:success] = 'Opinion Added'
  else
    puts @opinion.errors.full_messages
    flash[:danger] = 'Opinion not Added'
  end
end

private

def opinion_params
  params.require(:opinion).permit(:content, :type_of)
end

и, наконец, соответствующий код на странице показа темы:

<td>
  <%= render 'opinions/form', opinion: Opinion.new, typeOf: "pro", :topic => @topic %>
</td>
<td>
  <%= render 'opinions/form', opinion: Opinion.new, typeOf: "con", :topic => @topic %>
</td>

1 Ответ

0 голосов
/ 04 января 2019

Как вы можете видеть в параметрах запроса:

Parameters: {"utf8"=>"✓", "opinion"=>{"content"=>"This is an opinion"}, "type_of"=>"pro", "topicId"=>"{:value=>2}", "commit"=>"Create Opinion"}

Параметр topicId не вложен в opinion, поэтому вам нужно изменить искатель на:

@opinion.topic = Topic.find(params[:topicId][:value])

Вы также можете удалить лишнюю клавишу value в своем представлении:

<%= hidden_field_tag :topicId, @topic.id %>

Что еще больше упростит ваш искатель:

@opinion.topic = Topic.find(params[:topicId])

В сторону,Обратите внимание, что идиоматический ruby ​​требует snake_case во всех идентификаторах.Это не изменит работу вашего кода, но поможет другим разработчикам Ruby прочитать ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...