如何将对象从一个控制器传递到另一个控制器

时间:2015-10-07 05:04:34

标签: ruby-on-rails

我正在制作一个有两个模型BookSuggestion的图书馆应用。 Suggestion模型用于建议要添加到库中的书籍。

现在在Suggestion模型中,我添加了一种检索图书的方法,我希望将这本书添加到数据库中。

上述守则如下:

Suggestion.rb

def get_book
        h = as_json
        h.delete("id")
        h.delete("created_at")
        h.delete("updated_at")
        return Book.new(h)
    end

SuggestionController.rb

def approve
@book = @suggestion.get_book
    redirect_to @book, notice: "Book was successfully added into the database"

但由于@book尚未分配id,因此无法重定向。

所有其他控制器和型号都是通过脚手架启动的。

我应该如何保留建议中包含的信息并将其传递给图书管理员以添加到数据库中。

2 个答案:

答案 0 :(得分:1)

您可以重新定向到新书,而不是新创建的。新书属性您可以通过redirect_to传递,例如:

redirect_to new_book_path, notice: "Book was successfully added into the database", new_book: @book.to_json

并检查new_book方法中的new参数:

def new
    if params[:new_book].nil?
        # usual behavior
    else
        @book = Book.new(params[:new_book])
    end
end

答案 1 :(得分:0)

并不是真正相关,但希望帮助您获得更有效的代码。

而不是

def get_book
    h = as_json
    h.delete("id")
    h.delete("created_at")
    h.delete("updated_at")
    return Book.new(h)
end

你可以写

def get_book
  Book.new as_json.except(*[:id, :created_at, :updated_at])
end

仅供记录:如果您只是重定向,请不要在控制器中使用@var。如果您在模板中使用它们,则仅使用@var

度过愉快的一天!