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
Вы использовали эти два имени класса:
mimsformblack
mimsformgreen
Глядя на мой #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
перевернуты в вашем исходном коде.
Надеюсь, поможет!