我希望将控制器中的参数传递给模型,但是我的参数数量不断变化。
型号:
before_create :embed_info
def embed_info(embed_url)
something = embed_url
## Do some stuff
self.title = "Title" ##This works.
end
控制器:
Create action:
@post = Post.new post_params
@post.embed_info(params[:title])
if @post.save
redirect_to root_url, notice: 'post created'
else
render 'new'
end
答案 0 :(得分:0)
你不能像这样从控制器传递参数到模型回调。
您可以使用attr_accessor
创建虚拟属性,然后将该属性设置为来自控制器的创建操作的一部分。
答案 1 :(得分:0)
如果您手动调用embed_info
方法,则不应通过before_create
回调自动调用它。删除行before_create :embed_info
,因为它当前没有任何用途,除非您在尝试embed_info
模型时调用没有参数的save
。
您可能希望添加验证,这与before_create
回调不同。如果您的目的是确保调用了embed_info
,那么您应该使用验证来确保embed_info
的任何副作用都使模型处于有效状态。
答案 2 :(得分:0)
但我的参数数量不断变化。
由于这个原因,您收到参数错误:before_create :embed_info
。您可以删除该行,然后显式调用该方法,就像您在控制器中一样。
这可能不是最佳做法,但我认为它会使您的代码正常工作。
您可以做的另一件事是将用于派生title
的逻辑移动到控制器,然后使用参数传递标题。
# controller
def create
@post = Post.new post_params.merge(title: embed_info)
...
def embed_info
something = params[:title]
## Do some stuff
...
答案 3 :(得分:0)
您可以使用attr_accessor
创建embed_url
的虚拟属性。将它传递给新的行动本身。当你调用save时,before_save将被自己调用,你可以在那里使用embed_url
(作为它的虚拟属性)。
如果解释不清楚,请告诉我你是否需要帮助。