【问题标题】:Rails create action with multiple belongs_toRails 使用多个 belongs_to 创建动作
【发布时间】:2015-09-21 23:43:56
【问题描述】:

试图找出一种更好的方法来分配与相关模型的评论。

我有以下课程:

class User < ActiveRecord::Base
  has_many :reviews, dependent: :destroy
end

class Review < ActiveRecord::Base
  belongs_to :user
  belongs_to :restaurant
end

class Restaurant < ActiveRecord::Base
    has_many :reviews, dependent: :destroy
end

很简单的东西。评论必须有餐厅和用户。我的创建操作如下所示:

def create
    @restaurant = Restaurant.find(params[:restaurant_id])
    @review = @restaurant.reviews.build(review_params)
    @review.user = current_user

    if @review.save
        redirect_to @restaurant
    else
        render 'new'
    end
  end

  private
  def review_params
    params.require(:review).permit(:content)
  end

目前我为餐厅建立评论,然后将评论的用户分配给当前用户。

这一切都很好,但有没有更简洁的方法来建立关联? 有没有办法在强参数旁边为构建方法添加额外的参数?

我查看了accepts_nested_attributes_for,但无法正常工作。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord strong-parameters


    【解决方案1】:

    您可以在review_params 中使用merge,如下所示

    def review_params
      params.require(:review).permit(:content).merge(user_id: current_user.id)
    end
    

    这样你就可以在create 方法中删除这一行@review.user = current_user

    【讨论】:

    • 这正是我想要的。谢谢
    【解决方案2】:

    在您的表单中,您可以使用要分配的user_id 放置一个隐藏字段:

    <%= f.hidden_field :user_id, value: @user.id %>
    

    然后,将其添加到您的review_params

    params.require(:review).permit(:content, :user_id)
    

    【讨论】:

    • 我考虑过使用隐藏字段,但我不想包含敏感信息,例如用户 ID。据我了解,恶意用户仍然可以更改该值。还有其他选择吗?
    • 好吧,您只会在表单页面上显示user_id。并且仅限于登录用户。因此,除非我已经以您的身份登录,否则我看不到您的 user_id。是的,我可以更改隐藏字段的值,但我必须猜测一个 id 或者已经知道一个。
    • 另一种方法是在用户模型中有一个字段用于超级机密密码(例如,一个随机的 10-20 位数字)。它不会像 Active Record id 那样是连续的,因此很难让人猜到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多