Я чувствую, что понятия не имею, что делаю .. У меня есть смутная идея.Я надеюсь, что до сих пор я все делал правильно.
Любой способ, которым вы можете увидеть, чтобы сделать рефакторинг, был бы очень признателен.
Одна вещь, которую я заметил, это работает неправильно - она не загружаетсяправильные параметры, которые были ранее отправлены, если есть ошибка, и она отправляет на тот же URL.Кажется, что текстовые вводы загружают предыдущее значение, но переключатели выбора и переключатели сбрасываются на значения по умолчанию при каждой отправке.
ResourcesController # new
def new
@resource = Resource.new
@title = "Submit Resource"
@categories = Category.all
end
ResourcesController # create (обратите внимание, у меня есть @categories= Category.all в обоих ... в соответствии с DRY я не уверен, куда еще он должен пойти, или он работает только при первой отправке формы.
def create
@title = "Submit Resource"
@categories = Category.all
@resource = Resource.new(params[:resource])
category_ids = @categories.map { |c| c[1] }
if @resource.valid? and category_ids.include? params[:category_id]
@resource.cost = params[:cost]
@resource.category_id = params[:category_id]
@resource.save
redirect_to root_url
else
render :action => :new
end
end
Resource.rb (модель)
# == Schema Information
#
# Table name: resources
#
# id :integer not null, primary key
# upvotes :integer default(0)
# downvotes :integer default(0)
# url :string(255)
# title :string(255)
# cost :integer default(0)
# description :text
# flags :integer
# category_id :integer
# user_id :integer
# created_at :datetime not null
# updated_at :datetime not null
#
class Resource < ActiveRecord::Base
belongs_to :category
belongs_to :user
has_many :favorites
has_many :resource_tags
has_many :tags, :through => :resource_tags
attr_accessible :url, :title, :cost, :description, :category_id, :user_id
# Pseudo-Enum
COST = [:free, :paid, :both]
url_regex = /^(?:http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?$/ix
validates :url, :presence => true,
:format => { :with => url_regex,
:message => "must be valid"},
:uniqueness => { :case_sensitive => false,
:message => "has already been submitted"}
validates :title, :presence => true,
:length => { :within => 6..75 }
validates :cost, :presence => true
validates :description, :presence => true,
:length => { :within => 25..200 }
validates :category_id, :presence => true,
:format => { :with => /\d+/ }
validates :user_id, :presence => true,
:format => { :with => /\d+/ }
def cost
COST[read_attribute(:cost)]
end
def cost=(value)
write_attribute(:cost, COST.index(value.downcase.to_sym))
end
def category_id
read_attribute(:category_id).to_i
end
def category_id=(value)
write_attribute(:category_id, value.to_i)
end
end
Мой файл просмотра для Resource # новая форма
<div class="field">
<%= f.label :category %>
<%= select_tag(:category_id, options_for_select(@categories.map {|c|[c.name, c.id]})) %>
</div>
Последнее В: я еще не работал с полем user_id. Это будет извлечено из devise и будет связывать пользователя спредоставленный ресурс. Но как мне назначить это, не делая какой-либо ввод, например скрытый ввод. Это будет происходить за кулисами в контроллере?