Rails 允许用户设置默认值

Rails allow user to set default

我正在使用一个允许用户创建项目的 Rails 应用程序。在这些项目中,用户可以制作清单。我正在尝试弄清楚如何让用户从项目索引页面中选择他们的 "Default Working Project"。然后这将在整个应用程序中传播,仅显示与当前项目关联的列表。制作这样的东西的最佳方法是什么。

Users table 中用 default_project_id 创建一个数据库字段并设置它。

在模型集上:

def default_project
   return projects.find_by_id(default_project_id) if default_project_id
   false
end

然后,你可以使用这样的东西:

lists = user.default_project ? user.default_project.lists : user.lists

您可以通过向用户 table 添加 default_working_project_id 字段轻松实现此目的。

然后在你的控制器索引中设置:

@default_working_project = current_user.default_working_project

在您的用户模型中添加:

belongs_to :default_working_project, class_name: Project, foreign_key: :default_working_project_id

您可以创建自己的动作。在您的路线文件中:

resources :projects do
  member do
    get 'set_default'
  end
end

在你的projects_controller中:

def set_default
  project.find params[:id]
  current_user.default_working_project_id = project.id
  respond_to do |format|
    if current_user.save
      format.html { redirect_to projects_path } 
    else
      format.html { render 'index', notice: "your error message" }
    end
  end
end

在您的视图中添加

link_to 'set default',  set_default_project_path(project.id)

已更新

要删除用户的当前默认项目 ID:

您可以通过一些方法来实现这一点,例如:

在您的项目模型中

如果你有那个项目 belongs_to 用户的关系,试试这个。

def is_a_current_project?  
  self.id == self.user.default_working_project_id  
end  

然后创建一个 after_destroy :remove_current_project_relation 回调方法。

还有方法,我建议将其添加到您的私有方法中:

def remove_current_project_relation  
  if is_a_current_project?  
   self.user.default_working_project = nil  
  end  
end

如果只有一个用户可以看到他的项目,其他用户将看不到其他用户的项目,我的建议是:

  1. projectstable中做一个布尔值is_default。通过迁移添加它。

  2. 在控制器中将:is_default添加到def project_params

  3. 在项目索引页中使用:

    <%= render @projects %>
    
  4. views/projects 文件夹中创建文件 _project.html.erb,向其中添加:

    <%= form_for project, remote: true do |f| %>
        # some project data
        <%= f.check_box :is_default, class: 'project_default' %>
    <% end %>
    
  5. projects_controller:

    def update
        @project = Project.find(params[:id])
        if @project.update_attributes(project_params)
            respond_to do |format|
                format.html { redirect_to project_page } # this will run when you update project from edit page in form without 'remote: true'
                format.js # this will run if you update project with 'remote: true' form
            end
        end
    end
    
  6. assets/javascripts 文件夹中的 projects.coffee 中:

    $('input.project_default').change -> $(this).closest('form').submit()
    
  7. views/projects文件夹中创建update.js.erb,向其中添加:

    $('#edit_project_<%= @project.id %>').replaceWith("<%= j render 'project' %>");
    
  8. projects_helper

    def current_project
        current_user.projects.find_by(is_default: true)
    end
    

也许您需要根据您的任务稍微更改这些。此解决方案将通过 JavaScript.

更新项目

另外如果在Project模型中增加一个方法就好了,当用户将其他项目设为默认时,可以使之前的默认项目不再默认等等。

当您需要使用默认项目中的列表时,您可以在视图中使用 default_project.lists