Rails允许用户设置默认值

时间:2015-12-14 18:59:09

标签: ruby-on-rails ruby default

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

3 个答案:

答案 0 :(得分:2)

Users表格中使用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

答案 1 :(得分:2)

您可以通过向用户表中添加@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)

在你的观点中添加

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

<强>已更新

从用户中删除当前默认项目ID:

您可以制定一些方法来实现这一目标,例如:

在您的项目模型中

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

after_destroy :remove_current_project_relation

然后创建一个def remove_current_project_relation if is_a_current_project? self.user.default_working_project = nil end end 回调方法。

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

void do_thing(std::vector<some_class*> some_class_vector)
{
    size_t items_to_process = some_class_vector.size();
    for (i = 0; i < items_to_process; i++)
    {
        some_class_vector[i]->compute();
    }
}

答案 2 :(得分:1)

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

  1. is_default表格中设置一个布尔值projects。添加迁移。

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

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

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

    <%= 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. projects.coffee文件夹中的assets/javascripts

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

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

    def current_project
        current_user.projects.find_by(is_default: true)
    end
    
  9. 也许你需要根据你的任务改变这些。此解决方案将通过JavaScript更新项目。

    此外,在Project模型中添加一个方法会很棒,当用户将其他项目设为默认值时,这将使之前的默认项目不是默认项目。

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