将视图/控制器中的参数传递给模型 - Rails

时间:2017-01-31 16:34:52

标签: ruby-on-rails ruby ruby-on-rails-4

我希望将控制器中的参数传递给模型,但是我的参数数量不断变化。

型号:

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

4 个答案:

答案 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(作为它的虚拟属性)。

如果解释不清楚,请告诉我你是否需要帮助。