检查和更新当前用户对象

时间:2015-04-18 05:06:40

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

我正在尝试更改当前用户的布尔值,并检查当前用户的布尔值是否为真。我有一个工作变量(user_id,显示发布它的用户的ID。此外,用户只有一个qr。

这应该更新当前用户boolean:

 <%  @qr = Qr.index.update_attributes(clue1: true) %>

此检查应检查当前用户的其中一个布尔值是否为真:

<% if @qr = Qr.index.clue1 == true %>
    Good job
  <% else %>
    You need to find the code!
<% end %>

这是我的qr控制器:

class QrController < ApplicationController

def index
    @user = User.find(params[:user_id])
    @qr = @user.Qr
  end

  def show
    respond_with(@qr)
  end

  def new
    @qrs = Qr.new
    respond_with(@qr)
  end

  def edit
  end

  def create
    @qr = Qr.new(qr_params)
    @qr = current_user.qr.build(params[:qr_params])
    @qr.created_by = current_user.id
    @qr.save
    redirect_to "/home/clues"
  end

  def update
    @qr.update(qr_params)
    respond_with(@qr)
  end

  def destroy
    @qr.destroy
    respond_with(@qr)
  end
end

用户和Qr模型

class Qr < ActiveRecord::Base
belongs_to :user
end

    class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
     has_many :qrs
   end

TDLR:我不知道它是否是当前的用户模型。

3 个答案:

答案 0 :(得分:0)

你需要定义

before_filter :set_user

private
def set_user
  @user = User.find(params[:user_id])
end
你的QrController中的

我希望它有效

答案 1 :(得分:0)

从您的代码中可以看出,用户只能访问自己的Qr。所以你的路线会有类似的东西

resources :qrs

(注意,控制器应始终为复数以使用自动路由)。

在这种情况下,您可以将当前用户的QR加载为

class QrsController < ApplicationController
  def index
    @qrs = current_user.qrs
    # do things
  end

  def show
    @qr = current_user.qrs.find(params[:id])
    # do things
  end
  # ...
end

==补遗==

您在视图中编写的代码并没有多大意义......

if @qr = Qr.index.clue1 == true

首先,您不要使用操作(index)作为帮助函数或查询函数。

其次,index是QrController的一个实例方法(你可以说是@qrc = QrController.new; @qrc.index,但无论如何,控制器的方法并不意味着你被调用,它们相应于特定路线/网址将由他们自己调用),而不是Qr的类方法。

第三,这段代码没有达到你的期望:

if @qr = Qr.index.clue1 == true

相同
if @qr = (Qr.index.clue1 == true)

因此,如果方法true返回true,则最终为变量@qr分配布尔值Qr.index.clue1,否则为false

同样适用于

Qr.index.update_attributes(clue1: true)

你正在混淆控制器的动作和模型发现者。

答案 2 :(得分:0)

假设这些线索属于qr

def create
  @qr = current_user.qrs.new(qr_params)
  @qr.assign_attributes(
    clue1 = true,
    clue2 = false,
    ...
  )
  if @qr.save
    redirect_to "/home/clues"
  else
    # handle failed save
  end
end

如果他们属于用户,则替换为

@qr.user.assign_attributes

然后你需要保存用户

if @qr.save && @qr.user.save