Hi guys I'm newbie in ruby on rails ... I have add product page and I want if there's a duplicate product name under 1 category e.g." Product name: testing ","Category: OTHERS" it validates "Product name is already exist please select another one". but if you change the Category e.g. "Product name: testing", "Category: Shop and Drop" and it will save the new product.
here's my code in my form: Add new products
<% content_for :post_content do %>
<div class="post">
<% form_for :product, @product do | fld | %>
<span class="notice"><% if @product.errors.any? %><p class="error"><%= @product.errors.first[1] %></p><% end %></span>
<table class="tbl-form" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td class="name" width="100">Code:</td>
<td colspan="99"><%= fld.text_field :product_code, :class => "large" %></td>
</tr>
<tr height="5"/>
<tr>
<td class="name" width="100">Name:</td>
<td colspan="99"><%= fld.text_field :name, :class => "large" %></td>
</tr>
<tr height="5"/>
<tr>
<td class="name" width="100">Start Week:</td>
<td colspan="99"><%= fld.select :start_week, options_for_select(StockMovement.order("year DESC, week DESC").map { | val | [ "#{ val.year }/#{ val.week }", val.id] }, :selected => @product.start_week), :class => "ddl_SW" %></td>
</tr>
<tr height="5"/>
<tr>
<td class="name" width="100">Category:</td>
<td colspan="99"><%= fld.select :product_category, options_for_select(ProductCategory.where("jos_product_category.published = 1").all.map { | val | [ val.name, val.id] }, :selected => @product.product_category)%></td>
</tr>
<tr height="5"/>
<tr>
<td class="name">Thumbnail:</td>
<td colspan="99"><%= fld.text_field :thumbnail, :class => "large" %></td>
</tr>
<tr height="5"/>
<tr>
<td class="name">Original Image:</td>
<td colspan="99"><%= fld.text_field :original_image, :class => "large" %></td>
</tr>
<tr height="5"/>
<tr><td class="name">Publish:</td><td><span id="yesno"><%= fld.check_box :published, :class => "hide-chk" %><a id="true" alt="1" rel="product_published" class="yes">Yes</a><a id="false" alt="0" rel="product_published" class="no on">No</a></span></td></tr>
<tr height="25"/>
<tr class="btn-holder">
<td colspan="99">
<input type="image" src="/images/btn-save.png" class="img-btn"><a href="<%= admin_products_path %>" class="lnk-btn back">Back</a>
</td>
</tr>
<tr height="5"/>
</tbody>
</table>
<% end %>
</div>
<% end %>
here's in my model:
validates_uniqueness_of :product_code, :message => 'Product code is already taken'
validates_presence_of :product_code, :message => "Product code is required"
validates_presence_of :name, :message => "Product name is required"
validates_uniqueness_of :name, :message => 'Product name is already taken'
here's in my controller:
def new
@product = Product.new
if request.post? and params[:product]
@product = Product.new(params[:product])
@product.creator = logged_user['clientID']
if @product.save
#render :json => params[:product]
redirect_to admin_product_show_url(:productID => @product.id), :notice => '<p class="success">You have successfully added a new product '"#{ @product.name }"'</p>'
end
end
end
note: product and category are different tables from database....
thanks in advance..
I am Assuming you must be having a reference key something like category_id in Products Table for category table
So change this
validates_uniqueness_of :name, :message => 'Product code is already taken'
to
validates_uniqueness_of :name, :scope => category_id, :message => 'Product code is already taken'
This will validate the uniqueness of product name for the specific category