Rails новое действие с разными моделями

У меня есть проблема в Rails с действием create - у меня есть эта информация в моем контроллере:

ComputerController 
def create
  @computer = Computer.new(computer_params)
  redirect_to computers_path
end

private  
 def computer_params
 require.params(:computer).permit(:computer_name,
 :cpu_tag,:serial,:location,:brand,:model,:ram,:cpu,:os,:warranty,:comments)  
end

Тогда в моей модели у меня есть несколько проверок:

class Computer < ActiveRecord::Base
 validates :computer_name,  uniqueness: true, presence: true,
 length:{maximum: 12} 
 validates :cpu_tag, length: {maximum: 4}, uniqueness: true, 
 :numericality =>   {:only_integer => true}
 validates :serial, presence: true
 validates :location, presence: true
 validates :brand, presence: true
 validates :model, presence: true
 validates :ram, presence: true
 validates :cpu, presence: true
 validates :os, presence: true
 validates :warranty, presence: true
 validates :comments, presence: true
end

Представление new.html.erb:

<div class="row text-center">
 <h2 class = "mimsinfoblackindex">Add A Computer To The Inventory </h2><hr/>

<div class="col-md-3 description_pc text-left">
   <%= form_for @computer do |f|%>  

    <h4 class = "mimsformgreen">
      <%= f.label :computer_name,'Computer Name:'%>
      <%= f.text_field :computer_name%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :cpu_tag, 'Computer Tag:'%>
      <%= f.text_field :cpu_tag%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :serial, 'Serial:'%>
      <%= f.text_field :serial%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :location, 'Location:'%> 
      <%= f.text_field :location%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :brand, 'Brand:'%>
      <%= f.text_field :brand%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :model, 'Model:'%>
      <%= f.text_field :model%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :ram, 'Ram:'%> 
      <%= f.text_field :ram%>
    </h4>

    <h4 class = "mimsformblack">  
      <%= f.label :cpu, 'Processor:'%>
      <%= f.text_field :cpu %>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :os, 'Operating System:'%> 
      <%= f.text_field :os%>
    </h4>

    <h4 class = "mimsformblack">
      <%= f.label :warranty, 'Warranty:'%>
      <%= f.text_field :warranty%>
    </h4>

     <h4 class = "mimsformblack">
      <%= f.label :comments, 'Comments:'%>
      <%= f.text_field :comments%>
    </h4>

        <%= f.submit 'Add The Computer'%>
  <% end %>

Я уже сделал TDD для своих моделей, и у меня нет проблем, но когда я отправляю компьютерную форму, на экране появляется сообщение об ошибке:

 wrong number of arguments (0 for 1)
 private  
 def computer_params
  require.params(:computer).permit(:computer_name,:cpu_tag,
  :serial,:location,:brand,:model,:ram,:cpu,:os,:warranty,:comments)  
 end

2 ответа

Решение

Чтобы добавить к ответу, есть некоторые исправления, которые вы можете сделать с помощью своего кода:


1 проверки

При определении того же presence В процессе проверки вы можете передать несколько аргументов (атрибутов) методу:

#app/models/computer.rb
class Computer < ActiveRecord::Base
   validates :serial, :location, :brand, :model, :ram, :cpu, :os, :warranty, :comments, presence: true
end

2 параметра

Рельсы strong params функциональность довольно специфична в том, что вам нужно "потребовать" параметр верхнего уровня, а затем "разрешить" его дочерние параметры:

def computer_params
  params.require(:computer).permit(:computer_name,:cpu_tag, :serial,:location,:brand,:model,:ram,:cpu,:os,:warranty,:comments)  
end

3 петли

В программировании выигрывает самый эффективный код.

Это означает, что вы не должны повторять кучу кода снова и снова (используя attributes метод):

#app/views/computers/new.html.erb
<%= form_for @computer do |f| %>

    <% @computer.attributes.each do |attr| %>
       <% xtra = "green" if attr == :computer_name %>
       <%= content_tag :h4, class: "misform #{xtra}" do %>
          <%= f.label attr.to_sym, attr.titleize + ":" %>
          <%= f.text_field attr.to_sym %>
       <% end %>
    <% end %>

    <%= f.submit 'Add The Computer'%>
<% end %>

Видишь, сколько это чище?


4 класса HTML

Вы использовали эти два имени класса:

mimsformblackmimsformgreen

Глядя на мой #3 Рекомендация, вы видите, как это очень неэффективно? Это нарушает принцип, называемый СУХОЙ (не повторяй себя), в соответствии с которым вы должны использовать как можно меньше кода с максимально возможной функциональностью.

Вы можете применить несколько классов CSS к каждому элементу, что означает, что вы сможете сделать следующее:

<div class="mimsform">This will be black</div> 
<div class="mimsform green">This will be green</div>

5 Создать

Когда вы создаете в Rails, вы должны сохранить объект в модели:

def create
  @computer = Computer.new computer_params
  redirect_to computers_path if @computer.save
end

Многие новички-разработчики не сохраняют свой новый объект, не позволяя им фактически сохранить данные в БД.

Попробуйте переписать ваш computer_params чтобы:

private  

def computer_params
  params.require(:computer).permit(:computer_name, :cpu_tag, :serial, :location, :brand, :model, :ram, :cpu, :os, :warranty, :comments)  
end

Похоже, что params а также require перевернуты в вашем исходном коде.

Надеюсь, поможет!

Другие вопросы по тегам