【问题标题】:Rails 4 - Strong Params - white labelling foreign keyRails 4 - Strong Params - 白标外键
【发布时间】:2015-11-14 22:03:19
【问题描述】:

我有一个 rails 4 应用程序。

在与另一个模型有belongs_to关联的控制器中创建允许的参数时,您是否需要在允许的参数中包含外键,以便在保存记录时可以更新它,还是自动更新?

【问题讨论】:

  • 你应该允许它,除非你使用嵌套表单

标签: ruby-on-rails foreign-keys strong-parameters


【解决方案1】:

不是自动的。

在 Rails 4 中,您必须允许该属性才能批量分配其值。另一个模型的外键是您尝试更新的当前模型的属性。不允许这样做,你不能更新它的值。

【讨论】:

    【解决方案2】:

    外键不是自动的,the associated object is:

    这意味着以下情况为真:

    #app/controllers/your_controller.rb
    class YourController < ApplicationController
       def create
          @item = Item.new new_params
          @associated = Associated.find x
    
          @item.associated = @associated #-> this always works & will save 
          @item.save
       end
    
       private
    
       def new_params
          params.require(:item).permit(:name, :etc) #-> foreign_key would have to be explicitly defined here if associated_id was passed from a form
       end
    end
    

    这应该让您对您可以对您的对象做什么有一些看法。


    更新

    如果你想每次都给当前用户分配一个帖子,你可以使用以下方法:

    #app/controllers/posts_controller.rb
    class PostsController < ApplicationController
       def create
          @post = Post.new post_params
          @post.user = current_user # -> however you identify the user
          @post.save
       end
    end
    

    【讨论】:

    • 嗨,Rich,但是您的参数 def 中的评论是我的困惑。我不要求用户在表单中传递他们的 id。这就是为什么我认为它不应该被列入白名单。
    • 如果你想在你的模型中明确定义x_id,你必须允许它的参数。如果你想填充关联的对象(IE 人不能改变它),你可以像上面那样做
    • 恐怕我也对这种说法感到困惑。如果有用户模型和帖子模型,用户可以创建帖子,帖子属于用户。 post params 方法是否必须有一个用户 ID 键 - 如果帖子表单不要求用户输入其用户 ID 的字段?
    • 好的,让我解释清楚。如果帖子属于用户,您可以使用我上面的代码在控制器中填充用户。仅当您希望用户为帖子选择 user_id 时才需要这些参数。
    • 但是params定义中对':etc'的引用是否意味着如果用户要创建一个帖子,etc包含外键?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多