Rails在过滤器之前设计控制器,仅向用户显示其数据

时间:2014-06-05 09:48:32

标签: ruby-on-rails devise

基本上我想要它,以便在您登录时我的视图中,只有您是创建它们的人才能查看与该项目关联的项目和资产。这是我现在的控制器:

class ProjectsController < ApplicationController


  before_filter :authenticate_user!

  def show
    @project = Project.find(params[:id])
  end


  def new
      @project = Project.new
  end

  def create
      @project = Project.new(project_params)
      @project.user_id = current_user.id if current_user
    if @project.save
      flash[:notice] = "Name successfully added."
      redirect_to(@project, :action => 'show')
    else
      render(:action => 'new')
    end

  end

  private

    def project_params
        params.require(:project).permit(:name, :id, :user_id)
    end

end

另外,由于我的用户has_many项目和项目has_many资产和项目都有user_id列和索引,这是否意味着创建的资产自动与该用户关联,或者我是否还需要将user_id添加到资产。

我说这个的原因是因为我希望能够在我看来:

#views/projects/show.html.erb

<% current_user.assets.each do |f| %>
<%= f.name %>
<%= f.url %>
<% end %>

或类似的东西。

此外,如果在同一页面上我想添加一个创建新资产按钮,我需要创建一个带有创建操作的资产控制器,或者我可以将它放在项目控制器中。

1 个答案:

答案 0 :(得分:3)

您要做的是范围Projectcurrent_user,如下所示:

class ProjectsController < ApplicationController
  before_filter :authenticate_user!

  def show
    @project = current_user.projects.find(params[:id])
  end

  def new
    @project = current_user.projects.build
  end

  def create
    @project = current_user.projects.build(project_params)

    if @project.save
      flash[:notice] = "Name successfully added."
      redirect_to(@project, :action => 'show')
    else
      render(:action => 'new')
    end
  end

  private

  def project_params
    # removed :user_id for security reasons (see below)
    params.require(:project).permit(:name, :id)
  end
end
  

另外,因为我的用户有很多项目和项目has_many资产和   projects有一个user_id列和索引,这是否意味着创建了一个   资产自动与该用户关联,或者我是否需要添加   user_id也是资产。

为此,请使用has_many through: -

映射关系
class User
  has_many :projects
  has_many :assets, through: :projects
end
  

另外,如果我想在projects / show.html.erb中创建一个新资产   看,我会用新方法创建一个资产控制器吗?   然后将按钮路由到该方法?或者我可以在里面这样做   项目控制员?

为此,您可以在accepts_nested_attributes_for模型中使用Profile

class Profile
  accepts_nested_attributes_for :assets
end

然后更新您允许的project_params

def project_params
  params.require(:project).permit(:name, :id, assets_attributes: [:etc])
end

几个笔记。使用应该可访问的assets_attributes: [:etc]属性更新Asset。可能是:name:file等。其次,请注意我已删除:user_id。这是一个非常重要的概念。允许:user_id表示可以使用该属性注入表单。在这种情况下,它允许用户将创建的Project分配给他们喜欢的任何用户。