Hi, I'm already using this:
DataMapper::Model.raise_on_save_failure = true
But I'm not getting any exception from the transaction
Code just evaluates correctly, but always false (@article.saved?) even
passing correct values to constructors.
For example, this code doesn't work as always evaluates as False on
the "if":
@article = Article.new(params[:article])
@stock_line = StockLine.new(
:work_center => default_work_center,
:units => @qty,
:available => @qty
)
DataMapper.repository(:default).transaction do
@article.save
@stock_line.article = @article
@stock_line.save
end
if @article.saved?
......
now the same code, but with transaction removed, works correctly:
@article = Article.new(params[:article])
@stock_line = StockLine.new(
:work_center => default_work_center,
:units => @qty,
:available => @qty
)
#DataMapper.repository(:default).transaction do
@article.save
@stock_line.article = @article
@stock_line.save
#end
if @article.saved?
....
I'm passing exactly the same values in every try.
I'm missing something...
On Jun 10, 6:39 pm, Emmanuel Gomez <[email protected]> wrote:
> Javier,
>
> In your first example, you were dealing with basic Ruby behavior: variables
> defined inside of blocks (`DataMapper.repository(:default).transaction do
> .... end`) are block-local, and don't exist in the enclosing (outer) scope.
>
> In your second example, there are many things that could prevent the Article
> from being saved. One way to handle this is via exceptions:
>
> @article = Article.new(params[:article])
> @article.raise_on_save_failure = true
>
> With the `raise_on_save_failure` option set to true, any failed #save or
> #update called on @article will cause an exception to be raised. This will
> cause the transaction to be rolled back. Of course, you will have to catch
> the exception (DataMapper::SaveFailureError) in your code and handle the
> failure appropriately.
>
> However, none of that will tell you _why_ the #save call failed. That's what
> Validations are for. Check `[email protected]` for messages about
> validations errors that may have prevented the save.
>
> -- Emmanuel
>
> On Jun 10, 2011, at 9:55 AM, Javier wrote:
>
>
>
>
>
>
>
> > Hi, I'm trying to use transactions in my code but I'm experiencing
> > some difficulties.
>
> > My code looks like this:
>
> > post "/article/new" do
> > @user = User.get(session[:uid])
> > @qty = params[:qty].to_i
>
> > DataMapper.repository(:default).transaction do
> > @article = Article.create(params[:article])
> > @article.stock_line = StockLine.create(
> > :work_center => default_work_center,
> > :units => @qty,
> > :available => @qty
> > )
> > end
>
> > if @article.saved?
> > @status = "Ok"
> > @article = Article.new
> > else
> > @status = "ERROR"
> > end
>
> > erb :"article/new"
> > end
>
> > When I execute the code on my browser (this is a sinatra app), I get
> > the following error:
>
> > No method "saved?" for Nil Class
>
> > So I assume that @article only exists inside the transaction object.
> > So I tried creating the object in the outside with this:
>
> > @article = Article.new(params[:article)
>
> > DataMapper.repository(:default).transaction do
> > @article.save
> > .....
> > end
>
> > In that case, @article.saved? always returns False.
>
> > What am I doing wrong? How can I check if an entire transaction has
> > failed?
>
> > Thanks
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "DataMapper" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected].
> > For more options, visit this group
> > athttp://groups.google.com/group/datamapper?hl=en.
--
You received this message because you are subscribed to the Google Groups
"DataMapper" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/datamapper?hl=en.