从rails上的表单值ruby更新模型数据

时间:2014-06-13 15:05:05

标签: ruby-on-rails ruby web ruby-on-rails-4

你好我对rails上的ruby很新。我有表格

<%= form_tag do %>
    <%= text_field_tag :fullname, params[:fullname], placeholder: 'fullname' %>
    .
    .
    .

    <a href="/userEdit"> <%= submit_tag "save" %> </a>
<% end %>

这些表格是更新模型数据。在我的控制器中我有

def updateUser
    user = Users.find(session[:user_id])
    user.fullname = params[:fullname]
    user.save
    render 'profile'
end

它不起作用(数据没有更新),但是当我尝试

def updateUser
    user = Users.find(session[:user_id])
    user.fullname = 'david'
    user.save
    render 'profile'
end

它正在运行(数据已更新)。我不知道哪里出错了,请帮助我。很抱歉提出这么简单的问题,我是Ruby的新手(Rails也是如此),我搜索过但没有得到合适的答案。谢谢

2 个答案:

答案 0 :(得分:3)

  

我对铁轨上的红宝石很新

欢迎 - 让我给你一些想法!

-

<强>表格

首先,您的form_tag未正确创建。你需要在这里放一条路线(所以它知道在哪里提交数据):

<%= form_tag your_path_here do %>

这适用于form_tag帮助器,但是,当您正在编辑对象时,您可能会更好地使用form_for帮助程序 - 它需要一个实际对象(值):

<%= form_for @user do |f| %>
   <%= f.text_field :full_name %>
   <%= f.submit "Submit" %>
<% end %>

这种类型的表单与Rails的resourceful结构一起使用,这是我的第二点......

-

<强>资源

Rails是围绕resourceful基础架构(每个数据对象都是resource)的想法构建的。如果您要更新/修改对象,典型的解释是您要编辑resource,因此需要使用rails&#39; resourceful structure来处理它:

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   before_action :set_user, only: [:edit, :update, :show]

   def index
       @users = User.all
   end

   def new
       @user = User.new
   end

   def create
       @user = User.new(user_params)
       @user.save
   end

   def edit
   end

   def update
      @user.update(user_params)
   end

   private

   def user_params
      params.require(:user).permit(:fullname, :etc)
   end

   def set_user
       @user = User.find params[:id]
   end

end

这将允许您为此定义resourceful routes

#config/routes.rb
resources :users

将此设置与form_for一起使用将对您有用

答案 1 :(得分:0)

一开始没注意到。你的表格不正确。您没有指定操作的网址,并且您将提交标记放在链接中,因此基本上您的链接被调用而不是您提交的表单。

<%= form_tag '/userEdit' do %>
    <%= text_field_tag :fullname, params[:fullname], placeholder: 'fullname' %>
    .
    .
    .

    <%= submit_tag "save" %>
<% end %>

确保您已为userEdit post方法指定了路由。