用户之间的点数交换Rails 4

时间:2015-05-07 22:29:21

标签: ruby-on-rails ruby database model-view-controller model

这是我网站的主要想法

  

用户数字1 会看到他喜欢的图片(由用户编号2 上传)   用户数字1 有足够的积分(用户选择的具体数字   2号)他点击下载链接,并被重定向到   下载页面...拥有该图片的用户数字2 得到他的   点。用户 number1 的方式,获得他的积分是上传一个   想象自己,其他用户都要下载它,所以他再次拥有   指向其他用户下载图片。

这里使用的模型及其控制器是Picture.rb和User.rb 这是我试过的

1.添加到用户模型,“点”列,使其成为整数,它将显示用户拥有的点数

2.添加到图片模型“points_needed”列,也应该是整数,显示下载图片所需的点数

3.添加到图片模型“picturelink”列,用户将插入该字段时,将图片上传到他们的图片,以便下载的用户可以重定向到该下载URL。(例如,在点击立即购买之后,到达最终页面,到产品),作为示例

在图片视图中创建图片时,new.html.erb 我把

<%= f.input :picturelink, :placeholder => "Enter the link(URL) to the files you want to share" %>

<%= f.number_field :pointsneeded %> # let them select how many points they 
will charge

并在show.html.erb中显示,也在图片模型中显示 我把

<%= @picture.picturelink %> #shows the Url of the picture download page(it will be hidden later)

<%= @picture.pointsneeded %> #show the points needed to get this picture

它完美地显示了一切

  

问题:当用户数字1 想要下载用户数字2 所拥有的图片时,如果用户 nr.1 点击“获取   这个图片按钮“他被重定向到下载页面,并且   积分将转移到用户数字2 图片的所有者。

尝试给定解决方案后进行编辑: 点击后

<%= link_to "Get this picture", download_picture_path(@picture) %>

我一直在

undefined method `pointsneeded' for #<Picture::ActiveRecord_Relation:0x007f8e20193ba0>

这是我在Picture Controller中使用的

  def downloadpage
    ActiveRecord::Base.transaction do
      current_user.points -= @picture.pointsneeded #this line gives error,and the next
      @picture.user.points += @picture.pointsneeded
      current_user.save
      @picture.user.save
      redirect_to @picture.picturelink #redirect to the final picture
    end
  end

路线

get '/downloadpage/:picture_id' => "pictures#downloadpage", as: :download_picture

**

  

最终解决方案:

** 将路线更改为(注意我使用:id,not:picture_id)

get '/downloadpage/:id' => "pictures#downloadpage", as: :download_picture

在控制器中添加(显示,编辑......并不重要,它们仅适用于我需要的应用程序),我添加了:下载页面

before_action :find_picture, only: [:show, :edit, :destroy, :update, :upvote, :downloadpage]

就是这样,感谢@ Mario,有关我如何解决这个问题的详细信息,请查看我们的聊天,链接到@Mario以及我的子评论。

2 个答案:

答案 0 :(得分:3)

为了控制整个体验,您可以将购买用户发送到PicturesController中的download操作。

在此操作中,您可以使用transaction从购买&#39;中删除积分。用户,并让他们去销售&#39;用户喜欢这样:

ActiveRecord::Base.transaction do
    current_user.points -= @picture.pointsneeded
    @picture.owner.points += @picture.pointsneeded
    current_user.save
    @picture.owner.save
end

current_user@picture.owner分别替换为您所谓的买卖用户。使用交易可以确保删除和添加积分,或者 都不会发生。想象一下,如果一个用户在没有人获得积分的情况下失分!想象一下,如果这是钱!这将是灾难性的。如果要确保在发生错误时保存或回滚所有内容,则使用事务。

然后使用redirect_to直接将@picture.picturelink发送给require 'open-uri' url = @picture.picturelink data = open(url).read send_data data, :disposition => 'attachment', :filename=> "#{@picture.name}.#{@picture.picturelink.split('.').last}" ,如果您想隐藏购买用户的直接链接(我认为这是保护&#的好主意) 39;卖家&#39;)你可以使用类似的东西:

(defn preparse-comments
  [s]
  (-> s
    (s/replace #"<!--" "<comment>")
    (s/replace #"-->" "</comment>")))

(defn revert-comments 
  [s]
  (-> s
    (s/replace #"<comment>" "<!--")
    (s/replace #"</comment>" "-->")))

(defn load-data
  [xml-filename]
  (-> xml-filename
    (slurp)
    (preparse-comments)
    (clojure.data.xml/parse-str)))

(defn emit-and-prep
  [data]
  (-> data
    (clojure.data.xml/emit-str)
    (revert-comments)))

答案 1 :(得分:2)

马里奥斯的答案很棒(从不知道交易)。如果您不知道,我可以添加的唯一内容是,您需要在routes.rb中为PicturesController中的下载操作创建一条新路线,以便&#34 ;得到这个图片按钮&#34; 工作。