这是我网站的主要想法
用户数字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以及我的子评论。
答案 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; 工作。