【问题标题】:How to save static page attributes in User model如何在用户模型中保存静态页面属性
【发布时间】:2015-04-19 04:20:08
【问题描述】:

要求:我需要在 ROR 中创建一个单页应用程序,用户可以在其中更改页面的背景颜色、字体,并且该更改应在用户会话中持续存在。

我正在做的是:我创建了一个以 home 为索引的控制器 static_pages 并在其视图下创建了一个名为 home.html.erb 的表单。

<%= form_for @user, :url => url_for(:controller => 'static_pages', :action => 'home') do |u| %>

 <br > 
 <p>
    <%= u.label :title %><br>
    <%= u.text_field :title %>
  </p>

  <p>
    <%= u.label :description %><br>
    <%= u.text_field :description %>
  </p>

  <p> <%= u.label :back_ground_color %><br>
    <select name="bgcolor" id="bgcolor">
        <option value="#FF3300">Orange</option>
        <option value="#00FF00">Green</option>
        <option value="#0000FF">Blue</option>
        <option value="#FF0066">Pink</option>
        <option value="#FFFF00">Yellow</option>
        <option value="#FFFFFF">White</option>
    </select>
  </p>

  <p>
    <%= u.label :font %><br>
    <select name="font" id="font">
        <option value="Times New Roman">Times new Roman</option>
        <option value="Verdana">Verdana</option>
        <option value="Arial">Arial</option>
        <option value="sans-serif">serif</option>
    </select>
  </p>

 <br >
  <p>
    <%= u.submit %>
  </p>
  <hr >
  <div style="background-color:#{current_user.font.nil? ? '#FFFFFF' : current_user.font}">
    This is the changes made in background
  </div>

  <div style="background-color:#{current_user.bgcolor.nil? ? '#FFFFFF' : current_user.bgcolor}">

  </div>

<% end %>

我为当前登录应用程序的用户创建了此表单,并且为此使用了 devise gem。现在,如果用户填写此表单并提交它必须更改页面的背景颜色,我正在尝试将其保存在用户数据库。用户的架构如下:

create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.text     "title"
    t.string   "bgcolor"
    t.text     "description"
    t.text     "font"
  end

我在控制器中将这些数据作为 static_pages_controller.rb 处理

class StaticPagesController < ApplicationController
  def home
    @user = User.new(params.require(:user).permit(:title, :description, :font, :bgcolor))
    if @user.save
      redirect_to '/static_pages/home'
    else
      flash[:notice] = "Developers to be blamed !!"
    end 
  end
end

当我提交此表单时,我收到如下错误:

param is missing or the value is empty: user

注意:routes.rb 看起来像这样

  devise_for :users, controllers: { registrations: "users/registrations" }
  devise_scope :user do
    authenticated :user do
      root :to => 'static_pages#home', as: :authenticated_root
    end
    unauthenticated :user do
      root :to => 'devise/registrations#new', as: :unauthenticated_root
    end
  end

请指导我在哪里做错了!并提前感谢

【问题讨论】:

  • 您确定在您的视图的第一行末尾没有do |u| 吗?如果是这样,u 变量来自哪里?
  • 对不起,我又编辑了,有做
  • 报错页应该有参数列表,能贴一下吗?
  • 参数为无,报错为{ActionController::ParameterMissing in StaticPagesController#home, param is missing or value is empty: user}

标签: ruby-on-rails ruby ruby-on-rails-3 devise


【解决方案1】:

尝试重定向到root_path 而不是'/static_pages/home'

您可能会遇到不同的问题:@user.save 将尝试保存新用户而不是更新现有用户。

还可以考虑隐式渲染视图,而不是显式重定向回相同的路径。这样,整个 if/else 块可以简化为:flash[:notice] = "Developers to be blamed !!" unless @user.save

进一步说明:单页应用程序大多在客户端呈现。控制器仍应根据 REST 原则设计。

【讨论】:

  • 如果你建议设计应该如何,那真的很有帮助
  • 这是一个相当大的块来描述。 theodinproject.com/ruby-on-rails/routing 应该让您对什么是 RESTful 路由有一个不错的概述。在这种情况下,您将发布到带有更新操作的UsersController。客户端将使用 AJAX / websockets 调用更新自身,而不是从服务器呈现。
  • 让我创建用户控制器然后这样做
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2021-01-10
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多