参考episode 57:create model through text field,自己进行实现,这段视频要实现的是在 product 中添加 tag。但是自己在处理的过程中总是会出现 category_id=nil,就是说 view 中的 new_category_name 传不到 model 中。
自己的代码已经上传到github
详细代码如下:
rails g scaffold category name:string
rails g scaffold product name:string content:text category:references
#model中
class Product < ActiveRecord::Base
belongs_to :category
attr_accessor :new_category_name
before_save :create_category_from_name
def create_category_from_name
create_category(name: new_category_name) unless new_category_name.blank?
end
end
#controller中
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
#view中
<div class="field">
<%= f.collection_select(:category_id, Category.all, :id, :name, prompt: "请选择")%>
<%= f.text_field :new_category_name %>
</div>
根据各位的指点,通过在 strong parameter 添加相关参数解决了这个问题,同时在实现另外一个 episode 的时候又遇到了问题,问题如下所示:
参考的是17 HABTM Checkboxes (revised),自己进行了实现,这是我提交到 github 中的代码
场景是为一个 model 添加多个可选 tag
在上一篇的论述中,是因为没有将需要传递的参数添加 strong parameter 中,因次参数被过滤。这次考虑了强参,但是因为遇到了不熟悉的 api,因此试了几次,都没有成功,代码如下:
rails g scaffold product name:string content:text
rails g scaffold category name:string
rails g scaffold categorization product_id:integer category_id:integer
#model
class Product < ActiveRecord::Base
has_many :categorizations
has_many :categories, through: :categorizations
end
class Category < ActiveRecord::Base
has_many :categorizations
has_many :products, through: :categorizations
end
class Categorization < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
#controller
def product_params
#不能确定使用category_id是否合适
params.require(:product).permit(:name, :content, :category_id)
end
#view
<div class = "field">
<%= hidden_field_tag "product[category_ids][]", nil %>
<% Category.all.each do |category| %>
<%= check_box_tag "product[category_ids][]", category.id, @product.category_ids.include?(category.id) %>
<%= category.name %></br>
<% end %>
</div>